协议的构成

其实,HTTP 是非常简单的基于文本的协议。

HTTP 报文包括以下三个部分

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

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

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

本质上就是 “HTTP over TCP over IP”,交互模式为 Request-Response

典型地,一个 HTTP 包含 请求响应 ,每个行以 \r\nCRLF)结束,即 0d0a

其中,首部和实部之间会有以两个 CRLF 来风格,可以参考以下这张图:

一般来说,一个稳健的 HTTP parser 也会把一个换行符作为分隔符。

方法

HTTP 定义了几种不同语义的方法,这些方法用于请求报文的起始行。

其中 GET 和 HEAD 方法被认为是安全的,因为这两种请求对服务器没有副作用。

GET

请求服务器发送某个资源。

与 GET 很像,但是服务器在响应中只返回首部,不返回主体。主要用于:

  • 在不获取资源的情况下了解资源的情况(比如判断其类型);

  • 通过查看响应中的状态码,看看某个对象是否存在;

  • 通过查看首部,测试资源是否被修改了;

等等。

服务器开发者必须确保返回的首部与 GET 请求所返回的首部完全相同。

PUT

向服务器创建资源。

PATCH

类似于 PUT,但是这种方法是对资源做不完整更新。

PATCH 方法不会删除资源,一般为非幂等行为。

POST

向服务器发送数据。

DELETE

请求服务器删除资源。

OPTIONS

请求服务器告知其支持的各种功能,这使得客户端不用实际访问那些资源就能判定访问各种资源的最优方式。