HTTP请求和响应

2013 - 6 - 25 作者 : Jimco 分类 : 技巧资源

    在调试浏览器兼容的时候碰到个怪异的 bug,傲游3 IE 兼容模式(根据 user-agent 信息可知是 IE7,但是 IE7 下没有此问题)下,跨域请求时不时会 request error(经 @傲游小护士提醒,启用 IE9 标准渲染,还是会有同样的问题),上图:


 点击查看原图

    两个请求除了随机参数不一样外其它条件完全相同,实际上在 request error 的时候请求也是有发出去的,但是在响应的时候不知道傲游3 在兼容模式下干了什么好事儿,反正是报错了。对于360、傲游这些尽给前端添麻烦的二逼行为,我一向是鄙视之,然后无视之!可恨的是业务需求往往不允许我们无视~

    说多了都是泪啊~不扯了,今天的重点是分析下 HTTP 的请求和响应消息格式:


    HTTP 规范 1.0[RPcl945] 和 1.1[RFC 2616] 定义了 HTTP 消息的格式。HTTP 消息分为请求消息和响应消息两类。

1、HTTP 请求消息格式


— HTTP 请求消息

下面是一个典型的 HTTP 请求消息:


GET /somedir/page.html H7TP/1.1
Host:www.chinaitlab.com
Connection:close
User-agent:Chrome/27.0.1453.116
Accept-language:zh-cn

(额外的回车符和换行符)


    仔细检查这个简单的请求消息,我们可从中学到不少东西。首先,这个消息是用普通的 ASCII 文本书写的。其次,这个消息共有 5 行(每行以一个回车符和一 个换行符结束),最后一行后面还有额外的一个回车特和换行符。当然,一个请求消息可以不止这么多行,也可以仅仅只有一行。该请求消息的第一行称为请求行 (request line),后续各行都称为头部行(header)。请求行有 3 个宁段:方法字段、URL 字段、HTTP 版本宇段。方法字段有若干个值可供选择,包括 GET、POST 和 HEAD。本例表明浏览器在请求对象 /somedir/page.html。版本字段是不言自明的;本例中浏览器实现的是 HTTP/1.1 版本。


    现在看 一下本例中的各个头部行。头部行 Host:www.chinaitlab.com 规定存放所请求对象的主机。请求消息中包含头部 Connection: close 是在告知服务器本浏览器不想使用持久连接;服务器发出所请求的对象后应关闭连接。尽管产生这个请求消息的浏览器实现的是 HTTP/1.1 版本, 它还是不想使用持久连接。User-agent 头部行指定用户代理,也就是产生当前请求的浏览器的类型。本例的用户代理是 Chrome/27.0.1453.116。这个头部行很有用,因为服务器实际上可以给不同类型的用户代理发送同一个对象的不同版本(这些不同版本位用同一个 URL寻址)。最后,Accept-languag:头部行指出要是所请求对象有简体中文版本,那么用户优先接收这个版本;如果没有这个语言版本,那么服务器应该发送其默认版本。Accept-languag:仅仅是 HTTP 的众多内容协商头部之一。


    上面的请求消息例子符合这个格式,不过一般格式中还有一个位于各个头部(及额外的回车符和换行符)之后的“附属体”。附属体不在 GET 方法中使用,而是在 POST 方法中使用。POST 方法适用于需由用户填写表单的场合,如往 google 搜索引擎中填入待搜索的词。用户提交表单后,浏览器就像用户点击了超链接那样仍然从服务器请求一个 Web 页面,不过该页面的具体内容却取决于用户填写在表单各个字段中的值。如果浏览器使用 POST 方法发出该请求,那么请求消息附属体中包含的是用户填写在表单各个字段中的值。与 GET 方法类似的是 HEAD 方法,两者的差别只是服务器在对 HEAD 方法的响应消息中去掉了所请求的对象,其他内容则与对 GET 方法的响应消息一样。


2、HTTP 响应消息格式


— HTTP响应消息
下面是一个典型的 HTTP 响应消息:

HTTP/1.1 200 0K
Connectlon:close
Date: Thu, 13 Oct 2005 03:17:33 GMT
Server: Apache/2.0.54 (Unix)
Last-Modified:Mon,22 Jun 1998 09;23;24 GMT
Content-Length:682l
Content-Type:text/html

(数据 数据 数据 数据 数据…………)


    这个响应消息分为3部分:1 个起始的状态行(status line),6 个头部行、1 个包含所请求对象本身的附属体。状态行有 3 个字段:协议版本字段、状态码字段、原因短语字段。本例的状态行表明,服务器使用 HTTP/1.1 版本,响应过程完全正常(也就是说服务器找到了所请求的对象,并正在发送)。


    现在看一下本例中的各个头部行。服务器使用 Connectlon:close 头部行告知客户自己将在发送完本消息后关闭 TCP 连接。Date:头部行指出服务器创建并发送本响应消息的日期 和时间。注意,这并不是对象本身的创建时间或最后修改时间,而是服务器把该对象从其文件系统中取出,插入响应消息中发送出去的时间。Server:头部行,指出本消息是由 Apache 服务器产生的;它与 HTTP 请求消息中的 User-agent:头部行类似。Last-Modified:头部行指出对象本身的创建或最后修改日期或时间。Last-Modified 头部对于对象的高速缓存至关重要,且不论这种高速缓存是发生在本地客户主机上还是发生在网络高速缓存服务器主机(也就是代理服务器主机)上。Content-Length:头部行指出所发送对象的字节数。Content-Type:头部行指出包含在附属体中的对象是HTML文本。对象的类型是由Content-Type:头部而不是由文件扩展名正式指出的。


200 0K:请求成功,所请求信息在响应消息中返回。

301 Moved Permanently:所请求的对象己永久性迁移;新的 URL 在本响应消息的Location:头部指出。客户软件会自动请求这个新的 URL。

400 Bad Request:表示服务器无法理解相应请求的普通错误的状态码

404 Not Found:服务器上不存在所请求的文档。

HTTP Version Not Support:服务器不支持所请求的 HTTP 协议版本。


    最后给大家推荐两个抓包/代理工具:FiddlerRythem 。Fiddler 只能在 windows 平台下使用,腾讯 Alloyteam 开发的 Rythem 是跨平台,个人比较喜欢它的单个文件对应多个请求组合替换功能,是前端调试的利器!


上一篇:七月、八月 下一篇:

11888 人围观 / 8 条评论 ↓快速评论↓

  • 冒个泡,嘿嘿。。。

    jim 2013-08-20 15:34 回复

  • 冒个泡,嘿嘿。。。表示你域名没有涂抹全,还漏了一个。。。

    大懒猫 2013-07-24 14:22 回复

    • @大懒猫:囧~这都让你发现了。。。。。。。

      Jimco 2013-07-24 15:29 回复

  • 文章写得不错 这么好的文章,没人来看 那不是浪费了?我收藏了啊

    地坪涂料 2013-07-23 16:55 回复

  • 差不多一月一篇的文章,还是篇差不多都看不懂的阿狸16

    W3Cshare 2013-07-03 12:19 回复

    • @W3Cshare:囧~没那么难以理解吧,后面会多抽出时间来更新博客。

      Jimco 2013-07-03 17:30 回复

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18

Powered by Jimco

©2013 前端那些事儿 Designed by Jimco

About me|意见反馈