原文地址:http://androidguy.blog.51cto.com/974126/214420
当用户在浏览器中输入一个基于HTTP协议的URL时(以http://开头的URL),就相当于通知器按着这个URL组织生成一个HTTP请求,并交过个请求发送到服务器;同时,等待服务器的响应。无论是请求还是响应,都统称为HTTP消息。
HTTP协议消息分为两部分:
1. HTTP请求消息。
2. HTTP响应消息。
一、HTTP请求消息
HTTP请求消息分为请求消息头以及请求实体内容两部分。请求消息头的第一行必须由以下三部分组成:
请求的方法(GET、POST和HEAD等)。
Web资源的路径(http://www.website.com/test/test.html中的/test/test.html
部分)。
HTTP协议的版本(HTTP/1.0或HTTP/1.1)。
在请求消息头的其他行是请求头字段。每一行的格式是:
"头字段" ":" "头字段的值"
请求头以一个空行结束。如下面上一个GET请求的例子:
GET / HTTP/1.1
Host: www.csdn.net
Connection: Keep-Alive
Accept: */*
如果是POST请求,将要提交的实体内容放到消息头的空行后面,如下面是一个POST请求的例子:
POST /servlets-examples/servlet/RequestParamExample HTTP/1.1
Host: localhost:8888
Content-Length: 29
Connection: Close
firstname=Bill&lastname=Gates
在上面的请求消息中Content-Length表示请求内容的以字节为单位的长度(" firstname=Bill&lastname=Gates"的长度)。在使用POST方法时,这个字段必须提供,而且长度必须等于实体内容的长度,否则服务器将返回一个错误状态码。
二、HTTP响应消息
HTTP响应消息同样也分为消息头和实体内容两部分。HTTP的响应消息头和请求消息头类似;第一行是请求的结果,也就是说,在响应消息头的第一行表明了请求消息是否成功地获得了服务器上的Web资源。第一行必须由以下三部分组成:
1. 响应消息的HTTP版本。
格式为HTTP/1.1或HTTP/1.0。这个版本号未必和请求消息头的版本号一致;这主要是
因为,服务器未必支持HTTP请求中所描述的HTTP版本,如使用GET / HTTP/1.1去请求服务器,当服务器只支持HTTP1.0时,那么就会返回HTTP/1.0。
2. 状态码。
这个状态码由三位的数字组成,分为五个档次。下面是HTTP1.1的响应码:
(1)以1开头的数字(1xx)。
临时请求状态码。由100和101组成。这类状态码并不经常使用,它们的作为主要是服务器为客户端返回的临时的状态。
(2)以2开头的数字(2xx)。
请求成功状态码。范围从200到206。其中最常用的是200,它表示客户端请求成功,服务器已经将所请求的Web资源返回到了客户端。其他的六个状态码类似,都表示请求成功,只是要指引客户端进和下一步的动作。如状态码206表示服务器只是返回了一部分请求资源,客户端要想获得全部的Web资源,必须继续发出HTTP请求。其他的响应码的含义可以参阅HTTP1.1的规范RFC2616。
(3)以3开头的数字(3xx)。
Web资源重定向状态码。范围从300到307。所有以3开头的状态码都以不同的原因和方式使Web资源改变了原来的URL。如302通过一个Location字段确定了Web资源改变URL后的位置。有了这种状态码,当某个网站或其他的Web资源的URL变化后,而访问这些Web资源的用户并不能即使知道变化后的URL;因此,可以在用户访问原来的URL时加一个302响应,使客户端自动去访问新的URL。
(4)以4开头的数字(4xx)。
客户端错误状态码。范围从400到417。也许没人希望看到这状态码。但它们确实在Internet上大量存在。当用户访问的Web资源不存在或是没有权限访问Web资源时,服务器将返回这类状态码。这类状态码中最常遇到的是400。当用户发送一个不存在的Web资源路径时(GET、POST和HEAD方法后面跟的路径),服务器就会返回这个状态码。
(5)以5开头的数字(5xx)。
服务器错误状态码。范围从500到505。这类状态码也是一类错误状态码,只是它和4xx不同的是,5xx的错误是由于服务器的原因而产生的;如用户向服务器发送一个HTTP协议不支持的方法,如GET1,服务器将返回501错误,表示服务器不支持这个HTTP请求方法。
3. 状态信息。
响应信息的内容和状态码息息相关。如状态码为200,则状态信息为"OK"。状态码为501,状态信息为"Not Implemented"。要想详细了解每一个状态码所对应的状态信息,请参阅HTTP1.1的规范RFC2616。
HTTP响应消息的其他部分和请求消息一样,也是由很多响应头字段组成,每个字段和字段值占一行。响应消息头使用一个空行结束,空行的后面跟着HTTP响应消息的实体内容。如下面是一个完整的HTTP请求和响应的例子:
HTTP请求消息
GET / HTTP/1.1
Host:www.csdn.net
HTTP响应消息
HTTP/1.0 200 OK
Content-Length: 132273
Content-Type: text/html
Content-Location: http://www.csdn.net/index.htm
Last-Modified: Sun, 28 Jan 2007 09:20:00 GMT
Accept-Ranges: bytes
ETag: "eed72b7cbd42c71:1b0e"
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
Date: Sun, 28 Jan 2007 09:23:26 GMT
Age: 32
X-Cache: HIT from cachebj244.csdn.net
Connection: close
<!DOCTYPE html
从上面的HTTP消息可以看出,请求和响应消息中的HTTP版本并不一样,这说明CSDN的Web服务器为了和只支持HTTP1.0的客户端兼容,也采用了HTTP1.0协议。
注意:在HTTP请求和响应消息中的第一行的请求方法(GET、POST等)以及HTTP/1.1或HTTP1.0中的字母必须大写,请求方法后面的路径大小写都可。消息头字段对大小写不敏感,但大多数的请求和响应字段名都采取了首字母大写的方式。