前面介绍过了 http 请求,本节我们来了解一下 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
http响应-百家乐凯发k8
当服务器找不到客户端所请求的页面时,服务器会返回 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
the requested url /t.html was not found on this server.
当服务器执行 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
your browser sent a request that this server could not understand.
the request line contained invalid characters following the protocol string.