HTTP报文

作者: luffier | 来源:发表于2017-05-11 22:17 被阅读130次

    通过本文可以了解编写自己的 HTTP 应用程序所需掌握的大部分内容。具体来说,你会理解下列概念:

    • 报文是如何流动的;
    • HTTP 报文的三个组成部分(起始行、首部和实体的主体部分);
    • 请求和响应报文之间的区别;
    • 请求报文支持的各种功能(方法);
    • 和响应报文一起返回的各种状态码;
    • 各种各样的 HTTP 首部都是用来做什么的。

    报文流

    • HTTP 报文是在HTTP 应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动

    • HTTP 使用术语流入(inbound)和流出(outbound)来描述事务处理(transaction)的方向

    • 不管是请求报文还是响应报文,所有报文都会向下游(downstream)流动

    报文的组成部分

    HTTP报文的组成部分:对报文进行描述的起始行、包含属性的头部块、可选的,包含数据的主体部分


    HTTP 报文的三个部分
    • 起始行
      

    报文的第一行就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。

    •  首部字段
      

    起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。

    •   主体
      

    空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web 服务器的数据;响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。

    报文的语法

    所有的HTTP报文都可以分为两类,请求报文和响应报文。请求和响应报文的基本报文结构大致是相同的,只有起始行的语法有所不同。

    • 请求报文
      它会向Web服务器请求一个动作

    • 请求报文的格式:
      起始行: <method> <request-URL> <version>
      头部: <headers>
      主体: <entity-body>

    • 响应报文
      它会将请求的结果返回给客户端。

    • 响应报文的格式:
      起始行: <version> <status> <reason-phrase>
      头部: <headers>
      主体: <entity-body>

    下面是对各部分的简要描述:
    1、方式(method):客户端希望服务器对资源执行的动作,是一个单独的词,比如,GET、POST或HEAD

    2、请求URL(request-URL):要直接与服务器进行对话,只要请求URL是资源的绝对路径就可以了,服务器可以假定自己是URL的主机/端口

    3、版本(version):报文所使用的HTTP版本。其格式:HTTP/<主要版本号>.<次要版本号>

    4、状态码(status-code):状态码是三位数字,描述了请求过程中所发生的情况。每个状态码的第一位数字都用于描述状态的一般类别(比如,“成功”、“出错”等等)

    5、原因短语(reason-phrase):数字状态码的可读版本,包含行终止序列之前的所有文本。原因短语只对人类有意义,因此,尽管响应行HTTP/1.0 200 NOT OK和HTTP/1.0 200 OK中原因短语的含义不同,但同样都会被当作成功指示处理

    6、头部(header):可以有零个或多个头部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF首部是由一个空行(CRLF)结束的,表示了头部列表的结束和实体主体部分的开始

    7、实体的主体部分(entity-body):实体的主体部分包含一个由任意数据组成的数据块,并不是所有的报文都包含实体的主体部分,有时,报文只是以一个CRLF结束。

    展示一些假想的请求和响应报文:

    image.png

    起始行

    • 请求行
      请求报文请求服务器对资源进行一些操作。请求报文的起始行,或称为请求行,包含了一个方法和一个请求URL,这个方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行中还包含HTTP 的版本,用来告知服务器,客户端使用的是哪种HTTP。所有这些字段都由空格符分隔
    • 响应行
      响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,或称为响应行,包含了响应报文使用的HTTP 版本、数字状态码,以及描述操作状态的文本形式的原因短语。 所有这些字段都由空格符进行分隔。
      例如:HTTP/1.1 200 OK

    首部

    • 每个HTTP 首部都有一种简单的语法:名字后面跟着冒号(:),然后跟上可选的空格,再跟上字段值,最后是一个CRLF。(或者换行符)
      常见的首部实例
    image.png
    • 首部延续行
      将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或制表符(tab)。
      HTTP/1.0 200 OK
      Content-Type: image/gif
      Content-Length: 8572
      Server: Test Server
      Version 1.0
      在这个例子中,响应报文里包含了一个 Server 首部,其值被划分成了多个延续行。
      该首部的完整值为 Test Server Version 1.0。
    • 通用首部
      这些是客户端和服务器都可以使用的通用首部。可以在客户端、服务器和其他应
      用程序之间提供一些非常有用的通用功能。比如,Date 首部就是一个通用首部,
      每一端都可以用它来说明构建报文的时间和日期:
      Date: Tue, 3 Oct 1974 02:16:00 GMT
    • 请求首部
      从名字中就可以看出,请求首部是请求报文特有的。它们为服务器提供了一些额
      外信息,比如客户端希望接收什么类型的数据。例如,下面的Accept 首部就用
      来告知服务器客户端会接受与其请求相符的任意媒体类型:
      Accept: /
      Accept首部
    image.png

    安全请求首部


    image.png
    • 响应首部
      响应报文有自己的首部集,以便为客户端提供信息(比如,客户端在与哪种类型
      的服务器进行交互)。例如,下列Server 首部就用来告知客户端它在与一个版
      本1.0 的Tiki-Hut 服务器进行交互:
      Server: Tiki-Hut/1.0
    • 实体首部
      实体首部指的是用于应对实体主体部分的首部。比如,可以用实体首部来说明实
      体主体部分的数据类型。例如,可以通过下列Content-Type 首部告知应用程
      序,数据是以iso-latin-1 字符集表示的HTML 文档:
      Content-Type: text/html; charset=iso-latin-1
      内容首部
    image.png
    • 扩展首部
      扩展首部是非标准的首部,由应用程序开发者创建,但还未添加到已批准的
      HTTP 规范中去。即使不知道这些扩展首部的含义,HTTP 程序也要接受它们并
      对其进行转发。

    方法

    常见的http方法



    最常接触的方法是HEAD GET POST。
    1.GET
    通常用于请求服务器发送某个资源。



    2.HEAD
    HEAD 方法与GET 方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。

    使用HEAD,可以:在不获取资源的情况下
    · 了解资源的情况(比如,判断其类型);
    · 通过查看响应中的状态码,看看某个对象是否存在;
    · 通过查看首部,测试资源是否被修改了。



    3.post
    通常用于向服务器提交数据。表单提交常常用到post。

    状态码 image.png

    相关文章

      网友评论

        本文标题:HTTP报文

        本文链接:https://www.haomeiwen.com/subject/vbeetxtx.html