文章目录
- HTTP响应
- 1. 响应行
- 2. 响应头
- 3. 空行与响应体
- 4. HTTP响应示例
HTTP响应
当客户端发起一个请求后,一般都会得到一个服务器的响应,断网或者服务器宕机的情况下除外。服务器发送给客户端的 HTTP 响应用于向客户端提供其请求的资源,以及客户端请求的执行结果。
与请求类似,HTTP 响应同样由四个部分组成,分别为响应行(状态行)、响应头、空行和响应体,如下图所示:
1. 响应行
响应行以 HTTP 协议版本、表示响应状态的状态码和形容这个状态的一个短语组成,每个部分使用空格分隔,如下所示:
HTTP/1.1 200 OK
其中,HTTP/1.1 为 HTTP 协议版本,200 为响应的状态码,OK 为状态文本。注意:响应行中的字母都是大写的。
HTTP 响应的状态码是一个三位的整数,其中状态码的第一位用来表示响应的类别,状态码一共有 5 类,如下表所示;
状态码 | 状态码说明 |
---|---|
1xx | 信息,服务器收到请求,需要请求者继续执行操作 |
2xx | 成功,操作被成功接收并处理 |
3xx | 重定向,需要进一步的操作以完成请求 |
4xx | 客户端错误,请求包含语法错误或无法完成请求 |
5xx | 服务器错误,服务器在处理请求的过程中发生了错误 |
有关 HTTP 状态码的详细信息会在《HTTP 状态码》一节中进行讲解。关于响应行中的状态文本则是一种易于阅读的短语,用来描述状态码的具体含义,例如:OK、Not Modified、Found 等。
2. 响应头
响应头与 HTTP 请求中的请求头类似,同样由头部字段名、冒号、空格和值组成,例如Date: Tue, 22 Sep 2020 02:00:55 GMT。响应头中包含了一系列服务器的信息,以及服务器对请求的响应。
HTTP 协议的响应头中常用的头部字段名以及含义如下表所示:
头部字段名 | 说明 | 示例 |
---|---|---|
Accept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的范围请求 | Accept-Ranges: bytes |
Age | 从原始服务器到代理缓存形成的估算时间(单位为秒,不能为负数) | Age: 12 |
Allow | 服务器支持的请求方法,当使用不支持的请求方式时返回 405 | Allow: GET, HEAD |
Cache-Control | 告诉所有的缓存机制是否可以缓存及缓存类型 | Cache-Control: no-cache |
Content-Encoding | Web 服务器支持的返回内容压缩类型 | Content-Encoding: gzip |
Content-Language | 响应体的语言 | Content-Language: en,zh |
Content-Length | 响应体的长度 | Content-Length: 348 |
Content-Location | 可替代请求资源的另一个备用地址 | Content-Location: /index.htm |
Content-MD5 | 返回资源的 MD5 校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Content-Range | 使用范围请求时,定义返回的部分在整个返回体中的字节位置 | Content-Range: bytes 21010-47021/47022 |
Content-Type | 返回内容的 MIME 类型 | Content-Type: text/html; charset=utf-8 |
Date | 服务器做出响应的时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
ETag | 被请求变量的实体值 | ETag: “737060cd8c284d8af7ad3082f209582d” |
Expires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT |
Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT |
Location | 表示客户端应当到哪里去提取文档 | Location: http://c.biancheng.net/view/94.html |
Pragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache |
Proxy-Authenticate | 把由代理服务器所要求的认证信息发送给客户端 | Proxy-Authenticate: Basic |
refresh | 表示客户端应该在多少时间之后重定向一个资源 | Refresh: 5; url=http://c.biancheng.net/view/94.html |
Retry-After | 当请求的资源被占用时,通知客户端在指定时间之后再次尝试 | Retry-After: 120 |
Server | Web 服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
Set-Cookie | 设置 Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
Trailer | 在范围请求时,允许在响应的消息后面添加额外的元信息,比如消息的完整性校验,消息的数字签名,或者消息经过处理之后的最终状态等 | Trailer: Max-Forwards |
Transfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked |
Vary | 告诉代理服务器是使用缓存响应还是从原始服务器请求 | Vary: * |
Via | 告诉客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1) |
Warning | 警告响应体可能存在的问题 | Warning: 199 Miscellaneous warning |
WWW-Authenticate | 使用哪种验证方式去获取对资源的连接 | WWW-Authenticate: Basic |
3. 空行与响应体
与 HTTP 请求中的空行相同,HTTP 响应中同样使用空行来表示响应头结束。响应体则是服务器根据客户端的请求返回给客户端的具体数据。
4. HTTP响应示例
将上面的几个部分组合到一起就构成了一个 HTTP 响应,下面以访问 c.biancheng.net 上的 hello.htm 页面为例,HTTP 响应如下所示:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed
<html>
<body>
<h1>Hello, CSDN!</h1>
</body>
</html>
当服务器找不到客户端所请求的页面时,服务器会返回 404 错误,如下所示:
HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
<p>The requested URL /t.html was not found on this server.</p>
</body>
</html>
当服务器执行 HTTP 请求的过程中出现错误时,HTTP 响应如下所示:
HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: Closed
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
<title>400 Bad Request</title>
</head>
<body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.</p>
<p>The request line contained invalid characters following the protocol string.</p>
</body>
</html>