HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。
1.HTTP请求格式:
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
<request line>
<headers>
<blank line>
[<request-body>]
在HTTP请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的 资源 以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET:使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。如,/index.jsp?id=100&op=bind。
POST:POST方法将请求参数封装在HTTP请求数据中(具体位置看上图),以名称/值的形式出现,可以传输大量数据。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent:产生请求的浏览器类型。
Accept:客户端可识别的内容类型列表。
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。
get方式请求实例:
GET /books/?name=Professional%20Ajax HTTP/1.1 //请求行
Host: www.wrox.com //请求头
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
post方式请求实例:
POST / HTTP/1.1 //请求行
Host: www.wrox.com //请求头
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded //指定POST数据的编码类型
Content-Length: 40
Connection: Keep-Alive
(此处空一行)
name=Professional%20Ajax&publisher=Wiley //请求数据,POST形式参数保存在这里,与请求数据相关的请求头是Content-Type和Content-Length。
2.HTTP响应格式:
<status line>
<headers>
<blank line>
[<response-body>]
在响应中唯一真正的区别在于第一行中用状态 信息 代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。
HTTP响应实例:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
常用的状态值:
2xx 成功
200 正常;请求已完成。
201 正常;紧接 POST 命令。
202 正常;已接受用于处理,但处理尚未完成。
203 正常;部分信息—返回的信息只是一部分。
204 正常;无响应—已接收请求,但不存在要回送的信息。
3xx 重定向
301 已移动—请求的数据具有新的位置且更改是永久的。
302 已找到—请求的数据临时具有不同 URI。
303 请参阅其它—可在另一 URI 下找到对请求的响应,且应使用 GET 方法检索此响应。
304 未修改—未按预期修改文档。
305 使用代理—必须通过位置字段中提供的代理来访问请求的资源。
306 未使用—不再使用;保留此代码以便将来使用。
307 暂时重定向
4xx 客户机中出现的错误
400 错误请求—请求中有语法问题,或不能满足请求。
401 未授权—未授权客户机访问数据。
402 需要付款—表示计费系统已有效。
403 禁止—即使有授权也不需要访问。
404 找不到—服务器找不到给定的资源;文档不存在。
405 错误的方法
406 没有可接受的
407 代理认证请求—客户机首先必须使用代理认证自身。
408 请求超时
409 冲突
410 已离开
411 需要长度
412 前提条件失败
413 请求实体太大
414 请求的 URI 太长
415 介质类型不受支持—服务器拒绝服务请求,因为不支持请求实体的格式。
416 请求的范围不满足要求
417 期望失败
5xx 服务器中出现的错误
500 内部错误—因为意外情况,服务器不能完成请求。
501 未执行—服务器不支持请求的工具。
502 错误网关—服务器接收到来自上游服务器的无效响应。
503 无法获得服务—由于临时过载或维护,服务器无法处理请求。
504 网关超时
505 HTTP 版本不受支持
以下是一个简单的完整过程:
首先,我们想访问本页面。在浏览器上敲入“http://www.maketop.net/resource/rs_041112_02.php”.浏览器将连接www.maketop.net然后发送:
>> GET /resource/rs_041112_02.php Http1.1
>> Host: www.maketop.net
>> Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
>> Accept-Language: en
>> Accept-Encoding: gzip, deflate
>> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20040913 Firefox/0.10
>> Connection: Keep-Alive
>>
解释:浏览器请求页面“/resource/rs_041112_02.php”。并使用HTTP1.1协议。并告诉服务器你的浏览器是Firefox0.10。操作系统是Windows XP。 浏览器希望保持与www.maketop.net之间的连接,并请求获得多的文件,包括网页中的图片。翻译成语言上面是:
>> 用HTTP1.1协议获得 /resource/rs_041112_02.php
>> 访问的主机是: www.maketop.net
>> 接收的文件包括了: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
>> 使用的语言是: en
>> 接收的编码方式(浏览器能够解释的)是: gzip, deflate
>> 用户的浏览器信息:Windows XP的操作系统 Firefox/0.10的浏览器
>> 保持连接: 还要去图片
>>
www.maketop.net的服务器发出响应:
<< HTTP/1.1 200 OK
<< Date: Mon, 12 Mar 2004 19:12:16 GMT
<< Server: Apache/1.3.31 (Unix) mod_throttle/3.1.2
<< Last-Modified: Fri, 22 Sep 2004 14:16:18
<< ETag: "dd7b6e-d29-39cb69b2"
<< Accept-Ranges: bytes
<< Content-Length: 3369
<< Connection: close
<< Content-Type: text/html
<<
<< File content goes here
浏览器并从服务器的响应中获得服务器的信息:比如运行在Apache。
上面翻译成翻译成语言上面就是RFC 2616
参考:
http://blog.csdn.net/microtong/article/details/4155706
http://www.blogjava.net/honeybee/articles/164008.html
http://www.cnblogs.com/happyhotty/articles/2067673.html