在上一篇文章中演示了HTTP的传输过程,本文将重点介绍传输过程中的Request报文格式和一些扩展说明。

HTTP Request 是从浏览器(客户端)向web服务端发送的请求数据,其目的是让服务端做出相应的响应。HTTP Request 由以下三个部分组成:

  • 请求行
  • 请求头
  • 请求内容(可选)

请求行

定义请求方式、请求资源路径以及请求使用的HTTP版本(目前使用的最新版本是1.1),中间用空格隔开。比如:

GET  / HTTP/1.1

这个请求行所要表达的意思是:使用HTTP 1.1 以GET方式请求服务端的根目录资源。这时服务端会根据配置进行响应,比如返回index.html。

常用的请求方式有如下几种:

1、GET

最常见的一种请求方式,当你点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的时候,使用的都是GET方式。通过GET方式传递的数据直接表示在地址中,所以我们可以把请求结果以链接的形式发送给好友。以用google搜索domety为例,Request格式如下:

GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: http://www.google.cn/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: www.google.cn
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r

可以看到,GET方式的请求一般不包含”请求内容”部分,请求数据以地址的形式表现在请求行。地址链接如下:

http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=

地址中”?”之后的部分就是通过GET发送的请求数据,我们可以在地址栏中清楚的看到,各个数据之间用”&”符号隔开。显然,这种方式不适合传送私密数据。另外,由于不同的浏览器对地址的字符限制也有所不同,一般最多只能识别1024个字符,所以如果需要传送大量数据的时候,也不适合使用GET方式。

2、POST

对于上面提到的不适合使用GET方式的情况,可以考虑使用POST方式。POST方式对传送的数据大小没有限制,而且也不会显示在URL中。还以上面的搜索domety为例,如果使用POST方式的话,格式如下:

POST /search HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: http://www.google.cn/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: www.google.cn
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r

hl=zh-CN&source=hp&q=domety

可以看到,POST方式请求行中不包含数据字符串,这些数据保存在”请求内容”部分,各数据之间也是使用”&”符号隔开。POST方式大多用于页面的表单中。因为POST也能完成GET的功能,因此多数人在设计表单的时候一律都使用POST方式,其实这是一个误区。GET方式也有自己的特点和优势,我们应该根据不同的情况来选择是使用GET还是使用POST。

3、HEAD

HEAD就像GET,只不过服务端接受到HEAD请求后只返回响应头,而不会发送响应内容。当我们只需要查看某个页面的状态的时候,使用HEAD是非常高效的,因为在传输的过程中省去了页面内容。

请求头

对请求进行进一步的说明,以使服务端好更的理解请求的含意,常见的请求头有以下几个

  • Host:主机地址或域名,如127.0.0.1或domety.com
  • Accept:可以接受的文档类型
  • Accept-Charset:可以接受的字符集
  • Accept-Encoding:可以接受的编码方式,比如gzip
  • Accept-Language:可以接受的语言,比如zh-cn
  • User-Agent:客户端标识
  • Referer:转入地址
  • Cookie:Cookie信息

其中除了Host是必须的之外,其它都是可选,而且顺序可以任意排列。

请求内容

不是每个一次Request都需要请求内容,其实大多数的Request不包含”内容”,最常见的是用于POST方式传送数据时,请求内容包含了数据内容。请求内容和请求头之间有两个空行,而且空行中不能包含任何其它空白字符。