`
liuquanjc
  • 浏览: 61637 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

AJAX返回状态

阅读更多

Ajax xmlHttpRequest的status的值的含义
虽然常写ajax方面的东西,但是很少去专门了解xmlHttpRequest的status各个值的含义,今天在开发的过程中又遇到了问题,查过资料后,将他人已总结过的转载一下,学习学习。

xmlHttpRequest对象的status代表当前http请求的状态,是一个长整型数据,现在介绍一下它的含义。

http请求状态及其含义表

1xx - 信息提示
100 - 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)
101 - 服务器将遵从客户的请求转换到另外一种协议。(HTTP 1.1新)
2xx - 成功
200 - OK 一切正常,对GET和POST请求的应答文档跟在后面。
201 - Created 服务器已经创建了文档,Location头给出了它的URL。
202 - Accepted 已经接受请求,但处理尚未完成。
203 - Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝,非权威性信息(HTTP 1.1新)。
204 - No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。
205 - Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。
206 - Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。
3xx - 重定向
300 - Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。
301 - Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。
302 - Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求 http://host/~user (缺少了后面的斜杠),有的服务器返回301,有的则返回302。严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。
303 - See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。
304 - Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
305 - Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。
307 - Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)
4xx - 客户端错误
400 - Bad Request 请求出现语法错误。
401 - Unauthorized 访问被拒绝,客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。
404 - Not Found 无法找到指定位置的资源。这也是一个常用的应答。
405 - Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用,用来访问本页面的 HTTP 谓词不被允许(方法不被允许)(HTTP 1.1新)
406 - Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容,客户端浏览器不接受所请求页面的 MIME 类型(HTTP 1.1新)。
407 - Proxy Authentication Required 要求进行代理身份验证,类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)
408 - Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)
409 - Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)
410 - Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)
411 - Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)
412 - Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。
413 – Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。
414 - Request URI Too Long URI太长(HTTP 1.1新)。
415 – 不支持的媒体类型。
416 – Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)
417 – 执行失败。
423 – 锁定的错误。
5xx - 服务器错误
500 - Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。
501 - Not Implemented 服务器不支持实现请求所需要的功能,页眉值指定了未实现的配置。
502 - Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 亦说Web 服务器用作网关或代理服务器时收到了无效响应。
503 - Service Unavailable 服务不可用,服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。这个错误代码为 IIS 6.0 所专用。
504 - Gateway Timeout 网关超时,由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新) 。
505 - HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)。

 

0: (Uninitialized) the send( ) method has not yet been invoked.
 1: (Loading) the send( ) method has been invoked, request in progress.
 2: (Loaded) the send( ) method has completed, entire response received.
 3: (Interactive) the response is being parsed.
 4: (Completed) the response has been parsed, is ready for harvesting.

 0 - (未初始化)还没有调用send()方法
 1 - (载入)已调用send()方法,正在发送请求
 2 - (载入完成)send()方法执行完成,已经接收到全部响应内容
 3 - (交互)正在解析响应内容
 4 - (完成)响应内容解析完成,可以在客户端调用了

对于readyState的这五种状态,其他书中大都语焉不详。像《Foundations of Ajax》中,只在书中的表2-2简单地列举了状态的“名称”--The state of the request. The five possible values are 0 = uninitialized, 1 = loading, 2 = loaded, 3 = interactive, and 4 = complete。而《Ajax in Action》中好像根本就没有提到这5种状态的细节。

《Professional Ajax》中虽不尽人意,但还是有可取之处:

There are five possible values for readyState:
0 (Uninitialized): The object has been created but the open() method hasn’t been called.
1 (Loading): The open() method has been called but the request hasn’t been sent.
2 (Loaded): The request has been sent.
3 (Interactive). A partial response has been received.
4 (Complete): All data has been received and the connection has been closed.

readyState有五种可能的值:
0 (未初始化): (XMLHttpRequest)对象已经创建,但还没有调用open()方法。
1 (载入):已经调用open() 方法,但尚未发送请求。
2 (载入完成): 请求已经发送完成。
3 (交互):可以接收到部分响应数据。
4 (完成):已经接收到了全部数据,并且连接已经关闭。

《Understanding AJAX: Using JavaScript to Create Rich Internet Applications》中,则用下表进行了说明:

readyState Status Code
 Status of the XMLHttpRequest Object

(0) UNINITIALIZED  未初始化
The object has been created but not initialized. (The open method has not been called.)
(XMLHttpRequest)对象已经创建,但尚未初始化(还没有调用open方法)。

(1) LOADING  载入
The object has been created, but the send method has not been called.
(XMLHttpRequest)对象已经创建,但尚未调用send方法。

(2) LOADED  载入完成
The send method has been called, but the status and headers are not yet available.
已经调用send方法,(HTTP响应)状态及头部还不可用。

(3) INTERACTIVE  交互
Some data has been received. Calling the responseBody and responseText properties at this state to obtain partial results will return an error, because status and response headers are not fully available.
已经接收部分数据。但若在此时调用responseBody和responseText属性获取部分结果将会产生错误,因为状态和响应头部还不完全可用。

(4) COMPLETED  完成
All the data has been received, and the complete data is available in the responseBody and responseText properties.
已经接收到了全部数据,并且在responseBody和responseText属性中可以提取到完整的数据。

根据以上几本书中的关于readyState五种状态的介绍,我认为还是《Pragmatic Ajax A Web 2.0 Primer 》比较到位,因为它提到了对接收到的数据的解析问题,其他书中都没有提到这一点,而这一点正是“(3)交互”阶段作为一个必要的转换过程存在于“(2)载入完成”到“(4)完成”之间的理由,也就是其任务是什么。归结起来,我觉得比较理想的解释方法应该以“状态:任务(目标)+过程+表现(或特征)”表达模式来对这几个状态进行定义比较准确,而且让人容易理解。

现试总结如下:

readyState 状态    状态说明
 
(0)未初始化
 此阶段确认XMLHttpRequest对象是否创建,并为调用open()方法进行未初始化作好准备。值为0表示对象已经存在,否则浏览器会报错--对象不存在。
 
(1)载入
 此阶段对XMLHttpRequest对象进行初始化,即调用open()方法,根据参数(method,url,true)完成对象状态的设置。并调用send()方法开始向服务端发送请求。值为1表示正在向服务端发送请求。
 
(2)载入完成
 此阶段接收服务器端的响应数据。但获得的还只是服务端响应的原始数据,并不能直接在客户端使用。值为2表示已经接收完全部响应数据。并为下一阶段对数据解析作好准备。
 
(3)交互
 此阶段解析接收到的服务器端响应数据。即根据服务器端响应头部返回的MIME类型把数据转换成能通过responseBody、responseText或responseXML属性存取的格式,为在客户端调用作好准备。状态3表示正在解析数据。
 
(4)完成
 此阶段确认全部数据都已经解析为客户端可用的格式,解析已经完成。值为4表示数据解析完毕,可以通过XMLHttpRequest对象的相应属性取得数据。
 
概而括之,整个XMLHttpRequest对象的生命周期应该包含如下阶段:

创建-初始化请求-发送请求-接收数据-解析数据-完成

在具体应用中,明确了readyState的五个状态(XMLHttpRequest对象的生命周期各个阶段)的含义,就可以消除对Ajax核心的神秘感(语焉不详的背后要么是故弄玄虚,制造神秘感;要么就是“以其昏昏,使人昭昭”),迅速把握其实质,对减少学习中的挫折感和增强自信心都极其有益。

比如,通过如下示例:

//声明数组
var states = ["正在初始化……",
      "正在初始化请求……成功!<br/>正在发送请求……",
      "成功!<br/>正在接收数据……",
      "完成!<br/>正在解析数据……",
      "完成!<br/>"];


//回调函数内部代码片段
if (xmlHttp.readyState==4)
{
   
var span = document.createElement(“span”);
   span.innerHTML 
= states[xmlHttp.readyState];
   document.body.appendChild(span);             

   
if (xmlHttp.status == 200)
   {
     
var xmldoc = xmlHttp.responseXML;
     
//其他代码
   }             
    
//别忘记销毁,防止内存泄漏
    xmlHttp = null;
}
else
{
   
var span = document.createElement(“span”);
   span.innerHTML 
= states[xmlHttp.readyState];
   document.body.appendChild(span);
}


结果如下:

正在初始化请求……成功!
正在发送请求……成功!
正在接收数据……完成!
正在解析数据……完成!

我们很容易明白XMLHttpRequest对象在各个阶段都在做什么。因此,也就很容易对Ajax的核心部分有一个真正简单明了的理解。

分享到:
评论

相关推荐

    Ajax返回状态和XmlHttp对象参考手册

    Ajax返回状态和XmlHttp对象参考手册

    解决AJAX返回状态200没有调用success的问题

    总结一下,解决AJAX返回状态200但未调用`success`的问题,应重点关注以下几点: 1. 检查服务器返回的状态码是否真的表示成功,是否存在其他异常信息。 2. 查看响应头中的`Content-Type`是否为`application/json`,...

    快速解决ajax请求出错状态码为0的问题

    今天在使用 ajax 向后台请求数据时出现错误,提示状态码为 0 ,后台采用的是 spring mvc 架构。 状态码为0是什么意思呢?查找了下,原来它意味着 (未初始化)即没有调用到send()方法,我原来代码如下 : $.ajax...

    处理ajax返回的js代码

    标题 "处理ajax返回的js代码" 涉及的核心知识点是使用Ajax技术动态获取并执行JavaScript代码。Ajax(异步JavaScript和XML)是一种在无需刷新整个网页的情况下,能够更新部分网页的技术。它通过在后台与服务器交换...

    Ajax状态值详解

    Ajax的状态值是XMLHttpRequest对象的属性`readyState`,它表示请求/响应的当前状态。状态值分为五个阶段,每个阶段都有其特定的数值: 1. `readyState = 0`: 请求未初始化。XMLHttpRequest对象已经创建,但尚未调用...

    详谈ajax返回数据成功 却进入error的方法

    总结来说,文章为我们提供了一个解决AJAX返回数据成功却触发error回调的跨域问题的有效方法,以及相关的AJAX知识和HTTP响应头配置。这些内容对于开发人员在进行Web开发时遇到跨域问题具有很好的参考价值。

    ajax返回字符串

    Ajax返回字符串是Ajax交互过程中一个常见的场景,它涉及到JavaScript、HTTP请求和响应处理等多个方面。以下是对这个主题的详细解释: 一、Ajax基础 Ajax的核心是JavaScript对象XMLHttpRequest,它允许在后台与...

    ajax重写方法搭配后台filter返回status实现ajax请求跳转登录页面

    通常,当我们发送一个Ajax请求时,我们关注的是成功的200状态码或者错误状态码如404或500。但在需要用户登录的场景下,服务器可能会返回一个非200的状态码,比如401(未经授权)或403(禁止访问)。这时,我们可以...

    ajax返回json对象.zip

    这个"ajax返回json对象.zip"文件很显然是关于如何使用Ajax从服务器获取并处理JSON数据的一个教学或示例资源。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于机器...

    ajax状态码总结

    AJAX 状态码总结 AJAX(Asynchronous JavaScript and XML)是指使用 JavaScriptTechnology 在浏览器端与服务器端进行异步交互的技术。AJAX 的核心是 XMLHttpRequest 对象,它可以在不重新加载整个网页的情况下,...

    ajax使用例子 包括返回xml

    3. **服务器端**:可能是一个简单的Servlet或JSP,接收并处理来自Ajax的请求,然后返回XML或其他格式的数据。 总结,Ajax技术极大地提升了Web应用的交互性和响应速度,通过"ajax_xml运用.doc"文档和"AjaxDemo"项目...

    ajax异步刷新,一般处理程序返回datatable

    在本案例中,我们讨论的主题是如何利用Ajax技术进行异步刷新,并且服务器端的C#一般处理程序(Generic Handler)返回一个DataTable对象。 Ajax的核心在于JavaScript的XMLHttpRequest对象,它提供了与服务器进行异步...

    Ajax_001【返回String类型】

    这里的"返回String类型"表示我们的Ajax请求将处理服务器返回的字符串数据。Ajax的核心是利用JavaScript与XMLHttpRequest对象进行交互,实现页面的局部刷新,提高用户体验。 在Web开发中,当用户触发一个操作,如...

    ajax 的状态原理详解!

    在这个状态下,服务器正在处理请求,但响应还未返回。对于开发者而言,这是一个重要的状态,因为它意味着请求已经被成功发送并且正在等待响应。此时可以做一些额外的操作,比如显示加载提示。 4. **接收 (3)** 当...

    jQuery 制作一个Ajax带状态提示的登录按钮

    在本文中,我们将深入探讨如何使用jQuery库来创建一个具有实时状态提示的Ajax登录按钮。jQuery是一个非常流行的JavaScript库,它简化了DOM操作、事件处理和AJAX交互,使得前端开发更加高效。当我们构建一个带有Ajax...

    ajax ajax原理 ajax代码 ajax编程 ajax学习

    4. **监听状态变化**:通过`onreadystatechange`事件处理函数监听请求状态。当`readyState`属性值为4时,表示请求已完成。 5. **接收响应**:如果`status`属性值为200,表示请求成功,可以使用`responseText`或`...

    jquery ajax实例点击按钮触发Ajax loading

    在上述代码中,`id="ajaxButton"`是我们的触发按钮,而`id="loadingIndicator"`则是用于显示加载指示器的元素,初始状态为隐藏。 现在,编写JavaScript代码来处理按钮点击事件,并执行AJAX请求: ```javascript $...

Global site tag (gtag.js) - Google Analytics