HTTP报文
通过本文可以了解编写自己的 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。(或者换行符)
常见的首部实例
- 首部延续行
将长的首部行分为多行可以提高可读性,多出来的每行前面至少要有一个空格或制表符(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
- 响应首部
响应报文有自己的首部集,以便为客户端提供信息(比如,客户端在与哪种类型
的服务器进行交互)。例如,下列Server 首部就用来告知客户端它在与一个版
本1.0 的Tiki-Hut 服务器进行交互:
Server: Tiki-Hut/1.0 - 实体首部
实体首部指的是用于应对实体主体部分的首部。比如,可以用实体首部来说明实
体主体部分的数据类型。例如,可以通过下列Content-Type 首部告知应用程
序,数据是以iso-latin-1 字符集表示的HTML 文档:
Content-Type: text/html; charset=iso-latin-1
内容首部
- 扩展首部
扩展首部是非标准的首部,由应用程序开发者创建,但还未添加到已批准的
HTTP 规范中去。即使不知道这些扩展首部的含义,HTTP 程序也要接受它们并
对其进行转发。
方法
常见的http方法
最常接触的方法是HEAD GET POST。
1.GET
通常用于请求服务器发送某个资源。
2.HEAD
HEAD 方法与GET 方法的行为很类似,但服务器在响应中只返回首部。不会返回实体的主体部分。这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查。
使用HEAD,可以:在不获取资源的情况下
· 了解资源的情况(比如,判断其类型);
· 通过查看响应中的状态码,看看某个对象是否存在;
· 通过查看首部,测试资源是否被修改了。
3.post
通常用于向服务器提交数据。表单提交常常用到post。
状态码 image.png