1.2.4 HTTP消息
前面已提到,HTTP是一个采用请求/响应模式的协议。客户端想要获取资源,就应向服务器发出请求,如果服务器能够正确处理来自客户端的请求,并且拥有客户端所请求的资源,它就能正确地响应,同时将资源返回给客户端。反之,如果客户端发出的请求有问题或者服务器上没有所要请求的资源,那么就无法返回客户端所期望的结果。
这个请求与响应过程如同“对话”一样,服务器与客户端都必须理解对方的“语言”,这正是HTTP消息所要解决的问题。当客户端向服务器发送请求时,应使用HTTP协议规定格式的消息;而服务器也会向客户端返回规定格式的响应,这样客户端才能够理解。HTTP消息正是服务器和客户端之间交换数据的方式,它有两种类型:请求消息和响应消息。
HTTP请求消息和响应消息具有相似的结构,它们都包括以下4部分的内容。
起始行:即第一行,用于描述要执行的请求,或者是对应的状态,即成功或失败,这个起始行总是单行的。
HTTP消息头:这些消息头描述了请求或响应的相关属性、配置、对消息正文的描述等。
空行:指明消息头已经发送完毕。
消息正文:包含请求数据(如要创建的资源、HTML表单内容等),或响应中资源的表述,这一部分可以为空。
以下是典型的HTTP请求和响应的格式。
客户端请求如下:
GET / HTTP/1.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134 Accept-Language: zh-CN Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Upgrade-Insecure-Requests: 1 Accept-Encoding: gzip, deflate Host: microsoft.com Connection: Keep-Alive
服务端响应如下:
HTTP/1.1200 OK Date: Mon, 27 Jul2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
其中,HTTP请求是由客户端发出的消息,用于请求服务器执行某个操作,它的起始行包括以下3项。
HTTP方法:也称HTTP动词,如GET、PUT、POST等,它们描述要执行的动作。例如,GET表示要获取的资源,PUT表示向服务器提交数据(创建或修改资源),在下一节中我们将会详细讲解HTTP方法。
请求目标:通常是一个URL,它代表所要访问的资源。
HTTP版本:通常是HTTP/1.1。
而HTTP响应的起始行被称作状态行,包含以下3项。
协议版本:通常为HTTP/1.1。
状态码(Status Code):它表明请求是否成功,常见的状态码是200、404、500等。
状态文本(Status Text):一个简短的文本信息,用于描述状态码。
请求的起始行与响应的状态行,在上例中分别为GET / HTTP/1.1和HTTP/1.1200 OK。
请求的最后一部分是它的正文。注意,并不是所有的请求都有正文,比如获取资源(GET)、获取资源元数据(HEAD),以及删除资源(DELETE)等请求,通常它们不需要正文,而那些要将数据从客户端发送到服务器的HTTP方法,它们若要创建资源或更新资源,就需要提供正文,比如POST和PUT等。
响应的最后一部分也是正文。与请求消息一样,不是所有的响应都有正文,状态码如201或204等的响应,不包含正文。响应消息的正文通常是所请求资源的表述。