学科分类
目录
网络爬虫

客户端HTTP请求格式

在网络传输中HTTP协议非常重要,该协议规定了客户端和服务器端请求和应答的标准。HTTP协议能保证计算机正确快速地传输超文本文档,还确定了传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。

根据HTTP协议的规定,客户端发送一个HTTP请求到服务器的请求消息,由请求行、请求头部、空行、以及请求数据这四个部分组成,图1给出了请求消息的一般格式。

img

图1 请求消息的格式

接下来,我们结合一个典型的HTTP请求的示例,为大家详细地介绍HTTP请求信息的各个组成部分。示例内容如下所示。

GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: http://www.baidu.com/
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
Cookie: BAIDUID=04E4001F34EA74AD4601512DD3C41A7B:FG=1; BIDUPSID=04E4001F34EA74AD4601512DD3C41A7B; PSTM=1470329258; MCITY=-343%3A340%3A; H_PS_PSSID=1447_18240_21105_21386_21454_21409_21554; BD_UPN=12314753; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=7e2ad3QHl181NSPbFbd7PRUCE1LlufzxrcFmwYin0E6b%2BW8bbTMKHZbDP0g; BDSVRTM=0

一、请求行

上例中第1行为请求行,包含了请求方法、URL地址、和协议版本,代码如下:

GET https://www.baidu.com/ HTTP/1.1

其中GET是请求方法,https://www.baidu.com/是URL地址,HTTP/1.1指定了协议版本。

不同的HTTP版本下能够使用的请求方法也不同,具体介绍如下:

  • HTTP 0.9:只有基本的文本GET功能。

  • HTTP 1.0:完善的请求/响应模型,并将协议补充完整,定义了三种请求方法,分别是GET,POST和HEAD方法。

  • HTTP 1.1:在1.0基础上进行更新,新增了五种请求方法,分别是OPTIONS, PUT,DELETE,TRACE和CONNECT方法。

  • HTTP 2.0(未普及):请求/响应首部的定义基本没有改变,只是所有首部键必须全部小写,而且请求行要独立为:method、:scheme、:host、:path这些键值对。

这些请求方法的含义如表1所示。

表1 请求方法

序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
3 HEAD 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。
4 PUT 这种请求方式下,从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。

其中,最常用的请求方法是GET和POST,两者的区别在于:

  • GET是从服务器上获取指定页面信息,POST是向服务器提交数据并获取页面信息。

  • GET请求参数都显示在URL上,服务器根据该请求所包含URL中的参数来产生响应内容。 由于请求参数都暴露在外,所以安全性不高。

  • POST请求参数在请求体当中,消息长度没有限制而且采取隐式发送,通常用来向HTTP服务器提交量比较大的数据(比如请求中包含许多参数或者文件上传操作等)。 POST请求的参数不在URL中,而在请求体中,所以安全性也高,使用场合也比GET多。

二、请求报头

在请求行下是若干个请求报头,接下来为大家介绍常用的请求报头及其含义。

1. Host (主机和端口号)

指定被请求资源的Internet主机和端口号,对应网址URL中的Web名称和端口号,通常属于URL的Host部分。

2. Connection(连接类型)

表示客户端与服务器的连接类型,通常情况下,连接类型的对话流程如下:

(1)Client 发起一个包含 Connection:keep-alive 的请求(HTTP/1.1使用 keep-alive 为默认值)。

(2)Server收到请求后:

  • 如果 Server 支持 keep-alive,回复一个包含 Connection:keep-alive 的响应,不关闭连接;

  • 如果 Server 不支持 keep-alive,回复一个包含 Connection:close 的响应,关闭连接。

(3)如果Client收到包含 Connection:keep-alive 的响应,则向同一个连接发送下一个请求,直到一方主动关闭连接。

要注意的是,Connection:keep-alive在很多情况下能够重用连接,减少资源消耗,缩短响应时间。比如当浏览器需要多个文件时(比如一个HTML文件和多个Image文件),不需要每次都去请求建立连接。

3. Upgrade-Insecure-Requests(升级为HTTPS请求)

表示升级不安全的请求,意思是会在加载 HTTP 资源时自动替换成HTTPS请求,让浏览器不再显示HTTPS页面中的HTTP请求警报。

HTTPS 是以安全为目标的HTTP通道,所以在HTTPS承载的页面上不允许出现HTTP请求,一旦出现就是提示或报错。

4. User-Agent(浏览器名称)

标识客户端身份的名称,通常页面会根据不同的User-Agent信息自动做出适配,甚至返回不同的响应内容。

5. Accept (传输文件类型)

指浏览器或其他客户端可以接受的MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)文件类型,服务器可以根据它判断并返回适当的文件格式。

Accept报头的示例如下所示。

Accept: */*:表示什么都可以接收。
Accept:image/gif:表明客户端希望接受GIF图像格式的资源。
Accept:text/html:表明客户端希望接受html文本。
Accept: text/html, application/xhtml+xml;q=0.9, image/*;q=0.8:表示浏览器支持的 MIME 类型分别是 html文本、xhtml和xml文档、所有的图像格式资源。

在上述示例中,q表示权重系数,范围是0 =< q <= 1。q值越大,请求越倾向于获得其“;”之前的类型表示的内容。若没有指定q值,则默认为1,按从左到右排序顺序;若被赋值为0,则表示浏览器不接受此内容类型。

text用于标准化地表示文本信息,文本信息可以是多种字符集和多种格式的。

Application用于传输应用程序数据或者二进制数据。

MIME文件类型非常丰富,本书并未全部列举,大家感兴趣可以自行了解。

6. Referer (页面跳转来源)

表明产生请求的网页来自于哪个URL,用户是从该 Referer页面访问到当前请求的页面。这个属性可以用来跟踪Web请求来自哪个页面,是从什么网站来的等。

防盗链:有时候在下载某网站图片时,需要对应的referer,否则无法下载图片,那是因为人家做了防盗链。原理就是根据referer去判断是否是本网站的地址,如果不是,则拒绝,如果是,就可以下载。

7. Accept-Encoding(文件编解码格式)

指出浏览器可以接受的编码方式。编码方式不同于文件格式,它的作用是压缩文件并加速文件传递速度。浏览器在接收到Web响应之后先解码,然后再检查文件格式,许多情形下这可以减少大量的下载时间。例如:

Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

如果有多个Encoding同时匹配, 按照q值顺序排列,本例中按顺序支持 gzip, identity压缩编码,支持gzip的浏览器会返回经过gzip编码的HTML页面。

如果请求消息中没有设置这个报头,通常服务器假定客户端不支持压缩,直接返回文本。

8. Accept-Language(语言种类)

指出浏览器可以接受的语言种类,如en或en-us指英语,zh或者zh-cn指中文,当服务器能够提供一种以上的语言版本时要用到。

如果目标网站支持多个语种的话,可以使用这个信息来决定返回什么语言的网页。

9. Accept-Charset(字符编码)

指出浏览器可以接受的字符编码。示例如下:

Accept-Charset:iso-8859-1,gb2312,utf-8

常用的字符编码包括:

  • ISO-8859-1:通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,英文浏览器的默认值是ISO-8859-1。

  • gb2312:标准简体中文字符集。

  • utf-8:UNICODE 的一种变长字符编码,可以解决多种语言文本显示问题,从而实现应用国际化和本地化。

如果在HTTP请求消息中没有设置这个域,默认客户端是任何字符集都可以接受,则返回网页charset指定的编码。

10. Cookie(Cookie)

浏览器用这个属性向服务器发送Cookie。Cookie是在浏览器中寄存的小型数据体,它可以记载和服务器相关的用户信息,也可以用来实现模拟登陆。

11. Content-Type(POST数据类型)

指定POST请求里用来表示的内容类型。示例如下:

Content-Type = Text/XML; charset=gb2312:

上述示例指明了该请求的消息体中包含的是纯文本的XML类型的数据,字符编码采用“gb2312”。

点击此处
隐藏目录