Fork me on GitHub

【WebApi系列】浅谈HTTP在WebApi开发中的运用

WebApi系列文章

【01】浅谈HTTP在WebApi开发中的运用

【02】聊聊WebApi体系结构

【03】详解WebApi参数的传递

【04】详解WebApi测试和PostMan

【05】浅谈WebApi Cores

【06】详解WebApi 异常处理

【07】用WebAPI写个基于EF的CURD

【08】浅谈WebAPI身份认证

【09】详解系列化和模型绑定

【10】浅谈WebApi如何配合Mvc有效工作

【11】浅谈API Reference

【12】浅谈接口在软件架构中的作用

【13】浅谈WebApi和WebService的比较

【14】浅谈如何设计一个良好的接口

                                                                     

 


 

一  概述

在Web开发中,HTTP是必不可少的环节,在之前的【ASP.NET MVC系列】中,我们并没有讲解HTTP,并不是因为ASP.NET MVC与http关系不大,而是笔者个人觉得http与WebApi结合起来讲解,

效果可能会更好一些,因此,暂且就把“详解http”作为【WebApi系列】的开篇文章。

1.http是什么?

http是一种基于应用层的一种超文本传输协议(HyperText Transfer Protocol)

2.本章主要讲解什么?

本章目的就讲解:当我们在浏览器输入:http://www.google.com.hk/,浏览器给我们呈现Google界面,这个过程发生了什么,我暂且将发生的内容归于如下几点:

(1).域名解析

(2).TCP建立连接(三次握手)

(3).TCP通信(传递数据)

(4).断开连接(四次挥手)

基于如上过程,我们将分系一下:

(1)HTTP 请求

(2)HTTP响应

那么,我们先来看看。

HTTP协议定义了浏览器怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器,大致工作流程图如下图所示。

1.一次TCP连接,需要三个过程:建立连接(三次握手)、传送数据和释放连接(四次挥手);

2.http是基于TCP/IP协议的,且在五层模型中的运用层协议;

3.客户端请求URL,如上图的http://www.googl.com.hk;

4.服务器会根据客户端的请求,给予相应的响应(Responce);

 

下面,我们将简要列举涉及到的部分关键技术,分别如下:

(一)基于TCP/IP

关于网络传输模型,早期大致有四层模型结构和七层模型结构,经过演变,最终将四层模型结构和七层模型结构归结为五层结构模型。

1.五层结构模型:运用层、传输层、网络层、数据链路层和物理层;

2.传输协议:基于TCP/IP

3.http协议是基于运用层的协议;

4.五层结构中,从纵向上来说,客户端是从上往下传输,服务端是从下往上接受;

5.五层结构中,从横向上来说,每一层的协议必须是相同的,至少是相似(一般我们在分析层时,将会横向上虚拟抽象,屏蔽其他层);

6.运用层支持多种传输协议,如http协议,smtp协议,ftp协议等;

7.区分几个概念:TCP/IP协议,TCP协议和UDP协议

  (1)TCP/IP协议:TCP/IP是一组包括TCP协议和IP协议,UDP(User Datagram Protocol)协议、ICMP(Internet Control Message Protocol)协议和其他一些协议的协议组;

  (2)TCP协议:传输层中的传输控制协议;

  (3)UDP协议:传输层中的数据报问协议;

(二)特点

http协议具有很多优秀的特点,下图只是简要的列举其部分特点。

1.简单快速:http协议简单,客户端向服务器发送请求时,只需传送请求方法和路径即可,传送的内容简单轻量级,减少传输带宽,速度快;

2.B/S模式:B/S模式(Browse/Server模式),也叫客户端(Google,firefox,ie)/服务器模式,在Web开发中,基本都是基于B/S模式;

3.无连接:http协议本身是无连接的,虽然http使用了tcp连接,但通信双方在交换http保温之前不需要先建立http连接;

4.无状态:无状态是指协议对于事务处理没有记忆能力,也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问的相同;

(三)三次握手

每一次TCP连接都需要三个阶段:建立连接、传送数据和释放连接。三次握手就发生在建立连接阶段,其大致流程如下图所示。

 

1.第一次握手:客户端请求连接。客户端向服务器发出请求连接(client向server发送sys=j的包),进入发送请求状态(syn_sent状态),并等待服务器确认。

2.第二次握手:服务器接受请求并向客户端发出确认信息。当服务器收到syn包后,先确认客户的syn(ack=j+1),同时也需要发布一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态。

3.第三次握手:建立连接。客户端收服务器的syn+ack包后,向服务器发棕确认包ack(ack=k+1),当此包发送完毕后,客户端和服务器就进入了连接状态(连接成功),完成三次握手;

如上似乎有些抽象,我们举个打电话的例子:

我们打电话的目的是为了传递信息,在打电话前,我们需要先拨通对方的电话且对方应答之后,才能通电话(建立连接),以A,B两人通电话为例子:

A:拨打B的手机(拨号,拨通后等待B接电话,相当于第一次握手,请求等待状态);

B:看到A打来的电话(是A才接,确认),接了电话,对A说:您好,老A(向A表明自己是B,相当于第二次握手) ;

A:您好啊,老B(第三次握手);

双方都问候,表名自己身份后,就可以正式通话了(三次握手结束)。

(四)四次挥手

    TCP连接是全双工的,因此每个方向都必须单独进行关闭。当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接,收到一个 FIN只意味着这一方向上没有数据流动,
一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
1.TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
2. 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3.服务器关闭客户端的连接,发送一个FIN给客户端。
4.客户端发回ACK报文确认,并将确认序号设置为收到序号加1。

 (五)URI、URL与URN

1.URI、URL和URN定义 

     URI(Uniform Resource Identifier)代表统一资源标识符,标识资源的字符串;

     URL (Uniform Resource Locator)代表统一资源定位符,互联网上标准资源的地址;

     URN(Uniform Resources Name)代表统一资源名称,互联网上资源的名称;

2. 对URI、URL和URN三者之间解析

    (1)从命名角度,URI标识资源且唯一,URL标识资源地址 ,URN标识资源名称;

    (2)从数学关系:URI=URL+URN+URL∩URN;很容易看出,URL一定是URI,但URI不一定是URL,同理,URN一定是URI,但URI不一定是URN;

3. URL应具有特点

     (1)  域名便于记忆和拼写;

     (2)  简短;

     (3)  便于输入;

     (4)  可以反映出站点结构;

     (5)  应该是“可破解的”,用户可以通过移除URL的末尾,进而到达更高层次的信息体系结构;

     (6)  持久、不能改变

4  小结

       通常情况下,URI代表同意资源标识符(Uniform Resource Identifier)。URI是标识了一个资源的字符串。从技术角度看,所有URL都是URI。W3C认为“URL是一个非正式的概念,但它非常有用:

URL是URI的一种类型,它通过表示自身的主要访问机制来标识资源”,换句话说,URI是某种资源的标识符,而URL则为获取该资源提供了具体的信息。

       注释:资源是一个抽象概念,既可以指一个文件,也可以指方法调用的结果或服务器上的一些其他内容。

(六)HTTP几个关键概念

这个比较基础,学过计算网络的朋友,都应该知道,这里就不解释了,大致轮廓图如下所示。

 

 二  HTTP

(一)http请求

1.http请求一般由三部分构成:<请求行><请求头><请求体>

(1)请求行:<Method><Request-url><version>
 GET http://localhost:2172/api/Default/GetUserInfo?UserName=Alan_beijing  HTTP1.1
图解如下:

(2)请求头:header
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:2172
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
(3)请求体:Request-Body
由于本示例使用的是Get请求,Get方法没有请求体。

2.http请求方法

 

2.1Get

(1)一般由于获取查询资源,对应DB中的Select操作,为http请求常用方法 ;(2)该操作对系统来说,是安全的,因为其只查询而不修改数据;

(3)冥等的,对同一URL多次请求得到的结果应该是相同的;(4)参数在URL中传递,而非Rquest-Body中传递;

(5)有长度限制,如IE : 2803 ;Firefox:65536 ;Chrome:8182  ; Safari:80000 ; Opera:190000 (6)不安全,因为参数暴露在url中

2.2.Post

(1)一般用于向系统中更新数据,对应DB中的Update操作,为http请求常用方法;(2)参数在Requet-Body中传递 ;

(3)相比较Get,较为安全

2.3.Put

(1)一般用于向系统中插入数据(当然,其功能Post也能实现,与Post有很多相似之处),对应DB中的Insert操作;

(2)传输内容放在Request-Body中;

(3)不安全,不带验证机制,故一般不使用该方法;

2.4.Delete

(1)一般用于向系统中删除数据,对应DB中的Delete操作;

(2)不带验证机制,故不安全;

2.5.Head

(1) 用法与Get一样,只不过Head只返回Http-Responce头部信息;

(2)由于Head只返回头部信息(相对于Get,轻量级),故一般被用于确认URI的有效性,资源更新的日期时间等;

2.6.Patch

(1)部分文档更改;

2.7.Trace

(1)追踪路径,如追踪一个资源请求中间所经过的代理;(2)回显服务器收到的请求,主要用于测试或诊断;

2.8.Copy

(1)拷贝指定资源到目标位置;

2.9.Options

(1)一般用来询问URI支持的方法;(2)查询服务器的性能

2.10.Link

(1)建立连接关系;

2.11.UnLink

(1)断开链接关系

2.12.Purge

(1)清除;

2.13.PropFind

(1)查看属性

2.14.View

(1)查看

2.15.Connect

(1)隧道协议连接代理

2.16.Move

(1)将服务器资源移动到目标位置;

2.17.Wrapped

(1)允许客户端发送封装过的请求;

2.18.Extension-Method

(1)基于不变协议的前提下,可增加其他方法;

2.19.Lock

(1)加锁;

2.20.UnLock

(1)解锁;

 

3.请求头

现将常用的http请求头域列于如下。

 

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:2172
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36

 

(二)http响应

1.http响应一般由三部分构成:<状态行><响应头><响应体>;

2.状态行

2.1 状态行构成

 状态行一般由三个部分构成:<协议及其版本><状态码><描述>,

HTTP/1.1 200 OK;

2.2 状态代码和常见状态码

状态代码由 3 位数字组成, 表示响应的状态。

 3.响应头

关于响应头,与请求头原理差不多,这里就不讲解了。

Cache-Control:no-cache
Content-Length:123
Content-Type:application/xml; charset=utf-8
Date:Sat, 27 Jan 2018 09:54:22 GMT
Expires:-1
Pragma:no-cache
Server:Microsoft-IIS/10.0
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?QzpcVXNlcnNcQWxhbl9iZWlqaW5nXHNvdXJjZVxyZXBvc1xIdHRwRGVtb1xIdHRwRGVtb1xhcGlcRGVmYXVsdFxHZXRVc2VySW5mbw==?=

(三)例子

1.用VS2017写一个WebApi Get,步骤如下:

选择Web基架

 

 添加WebApi空基架

 修改WebApiConfi.cs路由配置和在控制器Default添加方法GetUserInfo

 

 测试结果

 

三   版权区

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
  • 可以转载该博客,但必须著名博客来源。
posted @ 2018-01-27 12:31  Alan_beijing  阅读(20711)  评论(13编辑  收藏  举报