zoukankan      html  css  js  c++  java
  • 【01】浅谈HTTP在WebApi开发中的运用

    一  概述

    在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

     

     测试结果

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/qianj/p/12778033.html
Copyright © 2011-2022 走看看