学科分类
目录
网络爬虫

服务端HTTP响应格式

HTTP响应由四个部分组成,分别是:状态行、响应报头、空行、以及响应正文,如图1所示。

img

图1 HTTP响应报文

一个HTTP响应的典型示例如下所示:

HTTP/1.1 200 OK
Server: Tengine
Connection: keep-alive
Date: Wed, 30 Nov 2016 07:58:21 GMT
Cache-Control: no-cache
Content-Type: text/html;charset=UTF-8
Keep-Alive: timeout=20
Vary: Accept-Encoding
Pragma: no-cache
X-NWS-LOG-UUID: bd27210a-24e5-4740-8f6c-25dbafa9c395
Content-Length: 180945

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ....

接下来,为大家详细地介绍HTTP响应中的响应报头和状态码的含义。

一、响应报头

理论上所有的响应头信息都应该是回应请求头的。但是服务端为了效率和安全,还有其他方面的考虑,会添加相对应的响应头信息。常用的响应报头和取值如下所示:

1. Cache-Control:must-revalidate, no-cache, private

这个报头值告诉客户端,服务端不希望客户端缓存资源,在下次请求资源时,必须要重新请求服务器,不能从缓存副本中获取资源。

Cache-Control是响应头中很重要的信息,当客户端请求头中包含Cache-Control:max-age=0请求,明确表示不会缓存服务器资源时,Cache-Control作为回应信息,通常会返回no-cache,意思就是说,“那就不缓存呗”。

当客户端在请求头中没有包含Cache-Control时,服务端往往会根据不同的资源指定不同的缓存策略。比如说oschina在缓存图片资源的策略就是Cache-Control:max-age=86400,这个意思是,从当前时间开始,在86400秒的时间内,客户端可以直接从缓存副本中读取资源,而不需要向服务器请求。

2. Connection:keep-alive

该报头回应客户端的Connection:keep-alive,告诉客户端服务器的TCP连接也是一个长连接,客户端可以继续使用这个TCP连接发送HTTP请求。

3. Content-Encoding:gzip

该报头的取值告诉客户端,服务端发送的资源是采用gzip编码的,客户端看到这个信息后,应该采用gzip对资源进行解码。

4. Content-Type:text/html;charset=UTF-8

这个报头值告诉客户端,资源文件的类型,还有字符编码。客户端需要使用UTF-8格式对资源进行解码,然后对资源进行HTML解析。通常我们会看到有些网站出现乱码,往往就是服务器端没有返回正确的编码。

5. Date:Sun, 21 Sep 2016 06:18:21 GMT

该报头表示服务端发送资源时的服务器时间,GMT是格林尼治所在地的标准时间。HTTP协议中发送的时间都是GMT的,这主要是解决在互联网上,不同时区在相互请求资源时的时间混乱问题。

6. Expires:Sun, 1 Jan 2000 01:00:00 GMT

这个响应报头也是跟缓存有关的,告诉客户端在这个时间前,可以直接访问缓存副本。很显然这个值可能存在问题,因为客户端和服务器的时间不一定是相同的,如果时间不同就会导致问题。所以这个响应报头是没有Cache-Control:max-age=*这个响应报头准确的,因为max-age=date中的date是个相对时间,不仅更好理解,也更准确。

7. Pragma:no-cache

这个报头的含义与Cache-Control等同。

8. Server:Tengine/1.4.6

这个报头表示服务器对应的版本,仅用于告诉客户端服务器的信息。

9. Transfer-Encoding:chunked

该响应报头告诉客户端,服务器发送资源的方式是分块发送的。一般分块发送的资源都是服务器动态生成的,在发送时还不知道发送资源的大小,所以采用分块发送。每一个块都是独立的,独立的块都能标示自己的长度,最后一块是0长度的,当客户端读到这个0长度的块时,就可以确定资源已经传输完了。

10. Vary: Accept-Encoding

该报头告诉缓存服务器,缓存压缩文件和非压缩文件两个版本。如今这个报头的用处并不大,因为现在的浏览器都是支持压缩的。

二、响应状态码

响应状态代码由三位数字组成,其中第1位数字定义了响应的类别,有五种可能取值。

常用的响应状态码如下所示。

  • 100~199:表示服务器成功接收部分请求,要求客户端继续提交其余请求才能完成整个处理过程。

  • 200~299:表示服务器成功接收请求并已完成整个处理过程。常用状态码为200(表示OK,请求成功)。

  • 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动到一个新地址。常用状态码包括302(表示所请求的页面已经临时转移至新的URL)、307和304(表示使用缓存资源)。

  • 400~499:客户端的请求有错误,常用状态码包括404(表示服务器无法找到被请求的页面)和403(表示服务器拒绝访问,权限不够)。

  • 500~599:服务器端出现错误,常用状态码为500(表示请求未完成,服务器遇到不可预知的情况)。

点击此处
隐藏目录