HTTP就像是因特网的信使,而报文就是信使用来传递东西的包裹。HTTP报文时在HTTP的应用程序之间发送的数据快,这些数据块是以文本形式的元信息开头。
每条报文都包含一条来自于客户端的请求,或者是来自于服务器的响应,她们有三个部分组成:对报文进行描述的起始行(start line)、包含属性的首部(header)、以及可选的,包含数据的主题(body)
(图片来自HTTP权威指南)
下面是我们打开百度网页时候的请求报文:
请求: GET / HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer : http://www.baidu.com/s? wd=www.baidu.com&rsv_bp=1&tn=baidu&ie=utf-8&inputT=3564&f=8&bs=www.baidu.com&rsv_sug4=537&rsv_sug1=2
Accept-Language: zh-Hans-CN,zh-Hans;q=0.8,en-US;q=0.5,en;q=0.3
User-Agent : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Accept-Encoding: gzip, deflate
Host : www.baidu.com
DNT : 1
Connection: Keep-Alive
Cookie: BD_UPN=11253144; BD_CK_SAM=1; BAIDUID=B7687C3B057C631C785FD8E4115F2AA5:FG=1; H_PS_PSSID=6623_1422_7570_7800_6996_7828_7729_7781_6506_6017_7825_7674_7892_7607_7799_7632_7836_7687_7803_7475
响应报文:
响应 : HTTP/1.1 200 OK
Date: Sat, 26 Jul 2014 06:33:00 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: Keep-Alive
Cache-Control: private
Cxy_all : baidu+f1c540f07047b27eba5362fd7cf3a8e4
Expires : Sat, 26 Jul 2014 06:32:15 GMT
X-Powered-By: HPHP
Server : BWS/1.1
BDPAGETYPE : 1
BDQID: 0xd7bc10d90008f47a
BDUSERID : 0
Set-Cookie: BDSVRTM=0; path=/
用Python 抓取的信息:
---------------------header--------- Date: Sat, 26 Jul 2014 06:09:17 GMT Content-Type: text/html; charset=utf-8 Transfer-Encoding: chunked Connection: Close Vary: Accept-Encoding Set-Cookie: BAIDUID=6D419D997AAD0E547B96E6FC84718F41:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com Set-Cookie: BDSVRTM=0; path=/ P3P: CP=" OTI DSP COR IVA OUR IND COM " Cache-Control: private Cxy_all: baidu+9b70894ee1674161ea842a5717aff56d Expires: Sat, 26 Jul 2014 06:08:36 GMT X-Powered-By: HPHP Server: BWS/1.1 BDPAGETYPE: 1 BDQID: 0xfcb39f4700088171 BDUSERID: 0
Content-Type用于说明 主体是什么,例子中为HTML,
---------起始行
1、请求行
请求报文请求服务器对资源进行一些操作,请求报文的起始行成为请求行。他包含了一个方法和一个请求的url.
2、响应行
响应报文的起始行称为响应行,它包含一个请求报文使用的HTTP版本,数字状态码等。
--------首部
首部就是跟在起始行后面的键值对。我们可以在上面请求百度的例子中看到。
安全方法:
HTTP定义了一组被称为安全方法的方法,GET方法和HEAD方法都被认为是安全的,这意味着使用GET或HEAD方法的HTTP请求都不会产生什么动作,也就是HTTP请求不会在服务器上产生什么结果。需要理解的是,安全方法并不是什么动作都不执行(实际上,这是有Web开发者决定的),使用安全方法的目的就是允许HTTP应用程序开发者通知用户,什么时候会使用某个可能引发某些动作的不安全的方法)