Prototype或JQuery可以在AJAX请求上返回HTTP状态代码

时间:2009-07-16 21:35:23

标签: javascript jquery ajax prototypejs transport

url = "http://example.com"
new Ajax.Request(url, {
  onComplete: function(transport) {
    alert(transport.status);
  }
});

我希望如果网站正常工作则返回200状态,如果不工作则返回500等等。但是该代码一直返回0。

最终,我希望有一个setinterval函数,定期ping网站的正常运行时间状态。

6 个答案:

答案 0 :(得分:7)

使用JQuery,您应该使用类似于您拥有的代码获取您的状态,它将是这样的:

$.ajax({
  url: 'some.url.com',
  type: 'POST',
  complete: function(transport) {
     if(transport.status == 200) {
         alert('Success');
     } else {
         alert('Failed');
     }
  }
 });

如果你想使用原型,你的代码应该只添加:

      onXYZ:function(transport){
      }

在上面的文本中,XYZ应该替换为您要为响应捕获的http状态代码。

希望这有帮助

答案 1 :(得分:4)

Ajax库本身并不“返回状态代码”;该代码是服务器响应中返回的HTTP响应代码。状态代码200表示成功; 404表示“未找到”,等等。

响应代码0很可能意味着甚至没有尝试过请求。请求URL是否与页面来源相同的域(子域,如果适用)?如果没有,那么您可能会遇到同源策略的问题,这会阻止脚本创建任意请求。

要解决此问题,您需要在服务器端代理数据;例如,使用脚本/框架处理程序/执行Web请求的任何内容,并将数据传递回客户端。调用“本地”代理而不是远程数据源。

答案 2 :(得分:2)

Prototype有onXYZ callbacks,例如:

new Ajax.Request(url, {
  method: 'get',
  on500: function(transport) {
    alert("failed!");
  },
  onSuccess: function(transport) { 
    alert("success!");
  }
});

但是,如果网站已关闭(如同,无法访问),则不会返回500错误,因此您的方法对初学者来说不是很好。

答案 3 :(得分:2)

通过创建服务器端代理文件来传递状态代码,我能够使远程域工作。我使用code on this post创建了一个asp.net页面,它只是将页面的状态代码设置为Web请求状态代码。

然后我使用了Chermosillo提供的ajax示例。

$.ajax({
  url: 'URLTestProxy.aspx?url=http://some.url.com',
  type: 'POST',
  complete: function(transport) {
     if(transport.status == 200) {
         alert('Success');
     } else {
         alert('Failed');
     }
  }
 });

这种方式可以解决相同的原始策略,并且仍然可以获取远程URL的状态代码。

答案 4 :(得分:1)

知道示例中的 transport 参数是XMLHttpRequest对象可能会有所帮助。可在此处找到此对象提供的方法和属性的完整详细信息:

http://www.w3.org/TR/XMLHttpRequest/#the-xmlhttprequest-interface

在这个问题的上下文中最值得注意的是response项:

  readonly attribute unsigned short status;
  readonly attribute DOMString statusText;
  DOMString getResponseHeader(DOMString header);
  DOMString getAllResponseHeaders();
  readonly attribute DOMString responseText;
  readonly attribute Document responseXML;

答案 5 :(得分:0)

你应该能够使用getResponseHeader()方法获得任意头。

对于jQuery,您可以尝试:

complete: function(transport, textstatus){ 
    alert(transport.getResponseHeader("Status"))
}

警告:未经过测试