应用层协议:HTTP协议(下)——请求方法与状态码、消息
应用层协议:HTTP协议(下)——请求方法与状态码、消息
请求方法与状态码
请求方法
HTTP/1.1协议中共定义了八种方法(也叫“动作”)来以不同方式操作指定的资源:
GET
向指定的资源发出“显示”请求。使用GET方法应该只用在读取资料,而不应当被用于产生“副作用”的操作中,例如在网络应用程序中。其中一个原因是GET可能会被网络爬虫等随意访问。参见安全方法。浏览器直接发出的GET只能由一个url触发。GET上要在url之外带一些参数就只能依靠url上附带querystring。
HEAD
与GET方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
POST
向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。每次提交,表单的数据被浏览器用编码到HTTP请求的body里。浏览器发出的POST请求的body主要有两种格式,一种是application/x-www-form-urlencoded用来传输简单的数据,大概就是”key1=value1&key2=value2”这样的格式。另外一种是传文件,会采用multipart/form-data格式。采用后者是因为application/x-www-form-urlencoded的编码方式对于文件这种二进制的数据非常低效。
PUT
向指定资源位置上传其最新内容。
DELETE
请求服务器删除Request-URI所标识的资源。
TRACE
回显服务器收到的请求,主要用于测试或诊断。
OPTIONS
这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*’来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECT
HTTP/1.1协议中预留给能够将连接改为隧道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。
方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。例如:
PATCH
用于将局部修改应用到资源。
状态码
所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。
状态代码的第一个数字代表当前响应的类型:
- 1xx消息——请求已被服务器接收,继续处理
- 2xx成功——请求已成功被服务器接收、理解、并接受
- 3xx重定向——需要后续操作才能完成这一请求
- 4xx请求错误——请求含有词法错误或者无法被执行
- 5xx服务器错误——服务器在处理某个正确请求时发生错误
HTTP 消息
HTTP 消息是服务器和客户端之间交换数据的方式。有两种类型的消息:请求(request)——由客户端发送用来触发一个服务器上的动作;响应(response)——来自服务器的应答。
请求
HTTP 请求的一个例子:
请求由以下元素组成:
- 一个 HTTP 的请求方法,经常是由一个动词像
GET
、POST
或者一个名词像OPTIONS
、HEAD
来定义客户端的动作行为。通常客户端的操作都是获取资源(GET 方法)或者发送 HTML 表单(POST 方法),虽然在一些情况下也会有其他操作。 - 要获取的资源的路径,通常是上下文中就很明显的元素资源的 URL,它没有 protocol(
http://
),domain(developer.mozilla.org
),或是 TCP 的 port (en-US)(HTTP 一般在 80 端口)。 - HTTP 协议版本号。
- 为服务端表达其他信息的可选标头。
- 对于一些像 POST 这样的方法,报文的主体(body)就包含了发送的资源,这与响应报文的主体类似。
标头(Header)
来自请求的 HTTP 标头遵循和 HTTP 标头相同的基本结构:不区分大小写的字符串,紧跟着的冒号(':'
)和一个结构取决于标头的值。整个标头(包括值)由一行组成,这一行可以相当长。
有许多请求标头可用,它们可以分为几组:
- 通用标头(General header),例如
Via
,适用于整个消息。 - 请求标头(Request header),例如
User-Agent
、Accept-Type
,通过进一步的定义(例如Accept-Language
)、给定上下文(例如Referer
)或者进行有条件的限制(例如If-None
)来修改请求。 - 表示标头(Representation header),例如
Content-Type
描述了消息数据的原始格式和应用的任意编码(仅在消息有主体时才存在)。
主体(Body)
请求的最后一部分是它的主体。不是所有的请求都有一个主体:例如获取资源的请求,像 GET
、HEAD
、DELETE
和 OPTIONS
,通常它们不需要主体。有些请求将数据发送到服务器以便更新数据:常见的的情况是 POST 请求(包含 HTML 表单数据)。
主体大致可分为两类:
- 单一资源(Single-resource)主体,由一个单文件组成。该类型的主体由两个标头定义:
Content-Type
和Content-Length
。 - 多资源(Multiple-resource)主体,由多部分主体组成,每一部分包含不同的信息位。通常是和 HTML 表单连系在一起。
响应
HTTP 响应的一个例子:
响应报文包含了下面的元素:
- HTTP 协议版本号。
- 一个状态码(状态码(status code)),来告知对应请求执行成功或失败,以及失败的原因。
- 一个状态信息,这个信息是非权威的状态码描述信息,可以由服务端自行设定。
- HTTP 标头,与请求标头类似。
- 可选项,比起请求报文,响应报文中更常见地包含获取资源的主体。
状态行
HTTP 响应的起始行被称作状态行(status line),包含以下信息:
- 协议版本,通常为
HTTP/1.1
。 - 状态码(status code),表明请求是成功或失败。常见的状态码是
200
、404
或302
。 - 状态文本(status text)。一个简短的,纯粹的信息,通过状态码的文本描述,帮助人们理解该 HTTP 消息。
一个典型的状态行看起来像这样:HTTP/1.1 404 Not Found
。
标头(Header)
响应的 HTTP 标头遵循和任何其它标头相同的结构:不区分大小写的字符串,紧跟着的冒号(':'
)和一个结构取决于标头类型的值。整个标头(包括其值)表现为单行形式。
许多不同的标头可能会出现在响应中。这些可以分为几组:
- 通用标头(General header),例如
Via
,适用于整个消息。 - 响应标头(Response header),例如
Vary
和Accept-Ranges
,提供有关服务器的其他信息,这些信息不适合状态行。 - 表示标头(Representation header),例如
Content-Type
描述了消息数据的原始格式和应用的任意编码(仅在消息有主体时才存在)。
主体(Body)
响应的最后一部分是主体。不是所有的响应都有主体:具有状态码(如 201
或 204
)的响应,通常不会有主体。
主体大致可分为三类:
- 单资源(Single-resource)主体,由已知长度的单个文件组成。该类型主体由两个标头定义:
Content-Type
和Content-Length
。 - 单资源(Single-resource)主体,由未知长度的单个文件组成。通过将
Transfer-Encoding
设置为chunked
来使用分块编码。 - 多资源(Multiple-resource)主体,由多部分 body 组成,每部分包含不同的信息段。但这是比较少见的。
HTTP/2 帧
HTTP/1.x 消息有一些性能上的缺点:
- 与主体不同,标头不会被压缩。
- 两个消息之间的标头通常非常相似,但它们仍然在连接中重复传输。
- 无法多路复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。
HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流(stream)中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为多路复用(multiplexing)的过程,它允许更有效的底层 TCP 连接。
HTTP 帧现在对 Web 开发人员是透明的。在 HTTP/2 中,这是一个在 HTTP/1.1 和底层传输协议之间附加的步骤。Web 开发人员不需要在其使用的 API 中做任何更改来利用 HTTP 帧;当浏览器和服务器都可用时,HTTP/2 将被打开并使用。
QUIC 协议
QUIC 协议通过基于 UDP 自定义的类似 TCP 的连接、重试、多路复用、流量控制技术,进一步提升性能。
参考链接
1.维基百科,https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
2.web开发技术,https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Session