Chinaunix首页 | 论坛 | 博客
  • 博客访问: 199296
  • 博文数量: 163
  • 博客积分: 4010
  • 博客等级: 上校
  • 技术积分: 1720
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-08 11:41
文章分类

全部博文(163)

文章存档

2011年(1)

2009年(162)

我的朋友

分类:

2009-06-17 16:08:58

 通过XMLHttpRequest对象向服务器发送请求是一件相当直接的事情。我们需要做的所有事情就是给它传递一个服务器页面的URL,这个页面将生成数据。就像下面这样:

  XMLHttpRequest支持大量的HTTP调用语义,包括用来动态生成页面的可选查询字符串参数(你可能已经知道这些CGI参数、 Form参数或者ServletRequest参数,取决于服务器端开发背景)。在考察请求对象如何支持这些功能之前,我们先来快速回顾一下HTTP的基 础知识。

  HTTP快速入门

  HTTP对于因特网而言可谓是无处不在,以至于我们通常都对它熟视无睹。在编写传统的web应用时,我们近距离接触HTTP协议的地方通常是定义一个超链接或者为一个表单设置method属性。而对于Ajax而言,我们可以深入那些协议的底层细节,这使得我们可以做一些惊人的事情。

  浏览器和Web服务器之间的HTTP事务包括浏览器发起的一个请求和随后服务器返回的一个响应(其中也包括执行Web开发人员编写的聪明绝顶、 激动人心的代码,这一点毫无疑问)。请求和响应本质上来讲都是文本流,客户端和服务器将它们解释为首部信息和紧随其后的主体部分。你可以将首部信息想像为 写在信封上的地址栏,而主体部分是信封中的信件。首部信息简单地指示接收方应该如何处理信件的内容。

  一个HTTP请求主要由首部信息和可能包含一些数据或参数的主体部分组成。响应则通常包含返回页面的HTML标记。Mozilla浏览器包含了一个很有用的工具,叫做LiveHTTPHeaders(见本章“资源”一节以及附录A)。我们来查看一下在浏览器工作时,那些请求和响应的首部信息的内容。打开Google的首页,看看在底层发生了些什么事情。

  我们发送的第一个请求包含有这样的首部信息:
  GET / HTTP/1.1
  Host:
  User-Agent: Mozilla/5.0
  (windows; U; Windows NT 5.0; en-US; rv:1.7)
  Gecko/20040803 Firefox/0.9.3
  Accept: text/xml,application/xml,
  application/xhtml+xml,text/html;q=0.9,
  text/plain;q=0.8,image/png,*/*;q=0.5
  Accept-Language: en-us,en;q=0.5
  Accept-Encoding: gzip,deflate
  Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
  Keep-Alive: 300
  Connection: keep-alive
  Cookie: PREF=ID=cabd38877dc0b6a1:TM=1116601572
  :LM=1116601572:S=GD3SsQk3v0adtSBP

第一行告诉我们使用的是哪个HTTP方法。大部分web开发者都很熟悉GET,这是用来获取文档的;还有POST,这是用来提交html表单的。万维网联盟(W3C)的规约还包括了一些其他的通用方法,包括HEAD,用来获取一个文件的首部信息;PUT,用于向服务器上传文档;DELETE,用来删除服务器上的文档。后续的首部信息是用来进行沟通的,客户端告诉服务器它所能支持的内容类型、字符集等等。因为我之前曾经访问过Google,它还发送了一个cookie,这段简短的消息告诉Google我是谁。

  下面显示的是响应的首部信息,也包含了大量的信息:
  HTTP/1.x 302 Found
  Location: %3D:
  TM%3D1116601572:S%3DzFxPsBpXhZzknVMF&prev=/
  Set-Cookie: PREF=ID=cabd38877dc0b6a1:CR=1:TM=1116601572:
  LM=1116943140:S=fRfhD-u49xp9UE18;
  expires=Sun, 17-Jan-2038 19:14:07 GMT;
  path=/; domain=.google.com
  Content-Type: text/html
  Server: GWS/2.1
  Transfer-Encoding: chunked
  Content-Encoding: gzip
  Date: Tue, 24 May 2005 17:59:00 GMT
  Cache-Control: private, x-gzip-ok=""

  第一行指示了响应的状态。302响应意味着重定向到另外一个页面。服务器还为此次会话发回了另外一个cookie。此外,还声明了响应的内容类型(也就是MIME类型)。这个重定向指令引起客户端发送了一个新的请求,随后得到了第二个响应,带有下列首部信息:
  HTTP/1.x 200 OK
  Cache-Control: private
  Content-Type: text/html
  Content-Encoding: gzip
  Server: GWS/2.1
  Content-Length: 1196
  Date: Tue, 24 May 2005 17:59:00 GMT

  状态码200表示成功,用以显示的Google首页附加在响应的主体部分。Content-type告诉浏览器,内容的类型是html。

  sendRequest()方法包含的第二个和第三个参数都是可选参数,大部分情况下都用不上。默认使用POST方法来获取资源,在请求的主体部分不需要传递任何参数。

  清单中的代码对请求进行设置后,会立即将控制权返回给我们,与此同时网络和服务器则忙着执行它们自己的任务。这对于提高响应能力很有好处,但是我们要怎样才能知道请求完成了呢?


阅读(571) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~