状态最常见有这几种:
- 0 :请求未初始化(还没有调用
open()
)。 - 1 :请求已经建立,但是还没有发送(还没有调用
send()
)。 - 2 :请求已发送,正在处理中(通常现在可以从响应中获取内容头)。
- 3 :请求在处理中;通常响应中已有部分数据可用了,但是服务器还没有完成响应的生成。
- 4 :响应已完成;您可以获取并使用服务器的响应了 。
注意在各个浏览器处理这些就绪状态并不一致。你可以通过
request.readyState 得到不同的就绪状态。
同时也可以在不同的状态中返回的数据是不同的,在状态3中的数据是不完整的。
Web 浏览器中您可能已经看到过几个状态代码:
- 401 :未经授权
- 403 :禁止
- 404 :没找到
在我们写ajax代码中经常会写这句话
request.status==200
在使用 Ajax 时 并不需要 关心的问题 —— 重定向。在 HTTP 状态代码中,这是 300 系列的状态代码,包括:
- 301 :永久移动
- 302 :找到(请求被重新定向到另外一个 URL/URI 上)
- 305 :使用代理(请求必须使用一个代理来访问所请求的资源)
Ajax 程序员可能并不太关心有关重定向的问题,这是由于两方面的原因:
- 首先,Ajax 应用程序通常都是为一个特定的服务器端脚本、servlet 或应用程序而编写的。对于那些您看不到就消失了的组件来说,Ajax 程序员就不太清楚了。因此有时您会知道资源已经移动了(因为您移动了它,或者通过某种手段移动了它),接下来要修改请求中的 URL,并且不会再碰到这种结果了。
- 更为重要的一个原因是:Ajax 应用程序和请求都是封装在沙盒中的。这就意味着提供生成 Ajax 请求的 Web 页面的域必须是对这些请求进行响应的域。因此 ebay.com 所提供的 Web 页面就不能对一个在 amazon.com 上运行的脚本生成一个 Ajax 风格的请求;在 ibm.com 上的 Ajax 应用程序也无法对在 netbeans.org 上运行的 servlets 发出请求。
实际上生成 HEAD 请求非常简单;您可以使用 "HEAD"(而不是 "GET" 或 "POST")作为第一个参数来调用 open()
方法
function getSalesData() {
createRequest();
var url = '${url}';
request.open("HEAD"
, url, true);
request.onreadystatechange = rollback;
request.send(null);
}
当您这样生成一个 HEAD 请求时,服务器并不会像对 GET 或 POST 请求一样返回一个真正的响应。相反,服务器只会返回资源的 头(header) ,这包括响应中内容最后修改的时间、请求资源是否存在和很多其他有用信息。您可以在服务器处理并返回资源之前使用这些信息来了解有关资源的信息。
function rollback() {
if (request.readyState == 4) {
alert(request.getAllResponseHeaders());
}
}
您会发现 HEAD 请求非常有用的一个领域是用来查看内容的长度或内容的类型。这样可以确定是否需要发回大量数据来处理请求,和服务器是否试图返回二进制数据,而不是 HTML、文本或 XML(在 JavaScript 中,这 3 种类型的数据都比二进制数据更容易处理)。
在这些情况中,您只使用了适当的头名,并将其传递给 XMLHttpRequest
对象的 getResponseHeader()
方法。因此要获取响应的长度,只需要调用 request.getResponseHeader("Content-Length");
。要获取内容类型,请使用 request.getResponseHeader("Content-Type");
。