HTTP消息是由普通ASCII文本组成。消息包括消息头和数据体部分。消息头以行为单位,每行以CRLF(回车和换行)结束,消息头结束后,额外增长一个CRLF,以后内容就是数据体部分了。
咱们能够在命令行窗口,经过TELNET,来测试HTTP协议。
1. 使用telnet链接到HTTP服务器,如要从google上请求index.html页面,首先要链接到服务器的80端口 php
telnet www.google.cn 80
2. 如今已经链接上了服务器,发送http请求消息:
connection: close
Host: www.google.cn
输入上面内容后,连续敲入两个回车,哈哈,是否是看到返回结果了。
这个请求的意思是:经过1.1版本协议请求index.html页面;connection: close是实用短链接,即服务器返回后就断开链接;Host字段知名页面所在的主机名。
返回结果应该是这样的:
HTTP/1.1 200 OK
Cache-Control: private, max-age=0
Date: Fri, 02 Jan 2009 12:26:17 GMT
Expires: -1
Content-Type: text/html; charset=GB2312
Set-Cookie: PREF=ID=7bbe374f53b6c6a8:NW=1:TM=1230899177:LM=1230899177:S=2EGHuZJnrtdQUB_A; expires=Sun, 02-Jan-2011 12:26:17 GMT; path=/; domain=.google.com
Server: gws
Transfer-Encoding: chunked
Connection: Close
这里有一个额外的CRLF
2. 请求消息格式
HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的通常格式。
:css
第一行是请求行:请求方法 URL路径 HTTP版本号,上面的例子中的请求行是:
GET /index.html HTTP/1.1
使用GET方法请求服务器根目录下的index.html文件,约定使用HTTP/1.1版本。
请求方法包括GET、POST、HEAD、OPTIONS、TRACE、PUT等几种,最经常使用的前2种。
1. GET方法。经过将参数附加在URL后面提交参数。如http://www.google.cn/search?hl=zh-CN& amp;newwindow=1&rls=com.microsoft%3Azh-cn%3AIE-SearchBox&q=%E6%89%8B%E6%9C%BA&meta=&aq=f&oq=
GET
2. POST方法。经过将参数附加在请求的头部行后面(GET方式是没有数据体的)提交参数。GET方式提交参数数据量通常限制在1k一下,而POST是没有限制的。POST通常用在表单数据提交的时候。
3. HEAD方法不让服务器在回应中返回任何实体。对HEAD请求的回应部分来讲,它的HTTP标题中包含的元信息与经过GET请求所获得的 是相同的。经过使用这种方法,没必要传输整个实体主体,就能够获得请求URI所指定资源的元信息。该方法一般用来测试超连接的合法性、可访问性及最近更 新。
头部行中的内容通常用来描述客户端能兼容的类型。如Accept-Language告诉服务器客户端支持哪些语言;Cache-Control告诉服务器客户端是否支持cache。
请求的附属体,GET不适用,POST方法提交数据时,用来存放请求的参数。
1. GET方式传递,直接在URL后面。
2. POST方式传递,请求行告诉服务器参数长度,经过附属体独立传给服务器。
3. Cookie方式传递,不要忘记这种方式了,会话Session功能就是经过这种方式实现的哦。
User-Agent:客户端的浏览器信息。
Connection:close表示使用短链接,Keep-Alive表示客户端支持持久链接。
Date:消息产生的当前时间。
Accept-Language:客户端支持的语言。
Cache-Control:客户端是否支持cache。no-cache表示客户端不支持cache,如max-age=3600,告诉User Agent 该请求的响应结果在多长时间内有效,在有效期内,当用户再次须要访问时,直接从客户端本地提取,不须要访问服务器。
Referer:Referer用以告诉服务器该请求来自于哪一个URL,能够用追踪用户的WEB访问路径。
If-Modified-Since: 若是请求消息包含If-Modified-Since标题 域,GET方法的语法就变成“条件GET”,即“(conditional GET)”。 条件GET方法能够对指定资源进行判断,若是它在If-Modified-Since标题域中的指定日期后发生了更新,才启动传输,不然不传输。这种条件 GET容许被缓存的实体在没必要通过屡次请求或没必要要的数据传输就能进行刷新,从而有助于下降网络负载。
Last-Modified: Sun, 03 Dec 2008 23:52:56 GMT
ETag: “1cbf3-dfd-3a2adcd8″
通常应用在文件下载上,用于标识响应内容的最后修改时间或内容较验码,当下一次User agent须要时,服务首先判断这二个值是否跟服务器上一致,同样则不须要返回内容。
Expires:该请求的响应结果在什么时间失效,在没有失效以前,代理可直接从缓存中返回之前的响应结果。
Host:指定请求资源的主机和端口号。HTTP/1.1请求必须指定Host,不然服务器会返回400状态码。
GET请求例子:
GET /css/news070130.css HTTP/1.1
Accept: */*
Referer: http://news.qq.com/a/20081224/000088.htm
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
If-Modified-Since: Thu, 29 Mar 2007 02:05:43 GMT; length=11339
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
Host: news.qq.com
Connection: Keep-Alive
Cookie: ssid=idlsesels; flv=9.0; icache=ADLFMBGC; adid=adsdifids; isflucky_50829637=0;
POST请求例子:
POST /Login.php HTTP/1.1
Accept: image/gif,*/*
Accept-language: zh-cn
Accept-encodeing: gzip
User-Agent: MSIE6.0
Host: www.some.com
Connection: Keep-Alive
Content-Length: 7
Cache-Control:no-cache
Cookie: name1=value1; name2=value2;
这里有一个额外的CRLF
username=b&passwd=d
3. 响应消息格式
HTTP响应也由三个部分组成,分别是:状态行、消息报头、响应正文。html
响应消息包括状态行、若干头部行和附属体(html数据实体)。
状态行包括:HTTP协议版本号、状态码、状态码的文本描述信息。如:HTTP/1.1 200 OK
状态码由一个三位数组成,状态码大致有5种含义:
1. 1xx。信息,请求收到,继续处理。
2. 2xx。成功。200请求成功;206断点续传。
3. 3xx。重定向。通常跳转到新的地址。
4. 4xx。客户端错误。404文件不存在
5. 5xx。服务器错误。500内部错误。
Set-Cookie:服务器设置客户端Cookie。设置格式是name=value,设置多个参数时中 间用分号隔开。Set-Cookie时还会用到几个参数:PATH设置有效的路径,DOMAIN设置cookie生效的域名,Expire设置 cookie的有效时间,0表示关闭浏览器就失效。
Location:当服务器返回3xx重定向时,该参数实现重定向。广告连接的跳转就使用这种协议。
Content-Length:附属体(数据实体)的长度
HTTP请求格式:
<request-line>
<headers>
<blank line>
[<request-body>]
说明:第一行必须是一个请求行(request-line),用来讲明请求类型,要访问的资源以及所使用的HTTP版本.
紧接着是一个首部(header)小节,用来讲明服务器要使用的附加信息.
以后是一个空行.
再后面能够添加任意的其余数据[称之为主体(body)].
例1 GET请求:数组
GET / HTTP/1.1
Accept: */*
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; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Host: www.google.cn
Connection: Keep-Alive
说明:请求的第一部分说明了该请求是一个GET请求.该行的第二部分是一个斜杠(/),用来讲明请求的是该域名的根目录.该行的最后一部分说明使用的是HTTP1.1版本(另外一个可选荐是1.0).
第2行是请求的第一个首部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的 重要基础.该信息由你的浏览器来定义,而且在每一个请求中自动发送.Connection,一般将浏览器操做设置为Keep-Alive
第三部分,空行,即便不存在请求主体,这个空行也是必需的.浏览器
例2 POST请求:缓存
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
说明:请求行开始处的GET改成POST,以表示不一样的请求类型.
Content-Type说明了请求主体的内容是如何编码的.浏览器始终以application/x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型.Content-Length说明了请求主体的字节数.
最后请求主体.名称-值对的形式.服务器
HTTP响应格式:
<status-line>
<headers>
<blank line>
[<response-body>]cookie
例:网络
HTTP/1.1 200 OK
Date: Fri, 22 May 2009 06:07:21 GMT
Content-Type: text/html; charset=UTF-8app
<html> <head></head> <body> <!--body goes here--> </body> </html> 说明:HTTP状态码200,找到资源,而且一切正常. Date:生成响应的日期和时间. Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8 HTML源文体.