HTTP 消息
HTTP 基于客户端-服务器架构模型和无状态请求/响应协议,该协议通过可靠的 TCP/IP 连接交换消息来运行。
一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。
一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。
HTTP使用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。
一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。这些消息包括从客户端到服务器的请求和从服务器到客户端的响应,它们将具有以下格式:
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
HTTP 请求和 HTTP 响应使用 RFC 822 的通用消息格式来传输所需的数据。这种通用消息格式由以下四项组成。
起始行
零个或多个标题字段
一个空行(CRLF)
消息体
在以下部分中,我们将解释 HTTP 消息中使用的每个实体。
消息起始行
起始行将具有以下通用语法:
start-line = Request-Line | Status-Line
我们将在分别讨论 HTTP 请求和 HTTP 响应消息的同时讨论 Request-Line 和 Status-Line。现在,让我们看看请求和响应情况下的起始行示例:
GET /hello.htm HTTP/1.1 (由客户端发出的请求行)
HTTP/1.1 200 OK (由服务端响应的状态行)
标题字段
HTTP 标头字段提供有关请求或响应或有关消息正文中发送的对象的必需信息。HTTP 消息头有四种类型:
- General-header:这些头字段对请求和响应消息都具有普遍适用性。
- Request-header:这些头字段仅适用于请求消息。
- Response-header:这些头字段仅适用于响应消息。
- Entity-header:这些标头字段定义了关于实体主体的元信息,或者,如果没有主体,则定义关于请求标识的资源的元信息。
上面提到的所有报头遵循相同的通用格式,每个所述报头字段的包含后面跟着冒号(:)的字段名称和字段值,如下所示:
message-header = field-name ":" [ field-value ]
以下是各种标头字段的示例:
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain
邮件正文
消息正文部分对于 HTTP 消息是可选的,但如果它可用,则它用于携带与请求或响应关联的实体正文。如果关联实体主体,则通常Content-Type和Content-Length标题行指定关联主体的性质。
消息体是承载实际 HTTP 请求数据(包括表单数据和上传的数据等)和来自服务器的 HTTP 响应数据(包括文件、图像等)的消息体。下面显示的是消息正文的简单内容:
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
接下来的两章将利用上面解释的概念来准备 HTTP 请求和 HTTP 响应。
示例
下面我们来看一个客户端请求和服务器响应的消息的示例
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
服务器响应消息
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。