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

如果站点正在运行,我希望它返回 200 的状态,或者如果它不运行,则返回 500 等。但是该代码一直返回 0。

最终,我想要一个 setinterval 函数,它会定期 ping 一个网站以了解正常运行时间状态。

4

6 回答 6

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 状态代码。

希望这可以帮助

于 2009-07-16T21:50:32.653 回答
4

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

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

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

于 2009-07-19T01:14:59.340 回答
2

原型有onXYZ 回调,例如:

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

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

于 2009-07-16T21:36:51.277 回答
2

通过创建服务器端代理文件来传递状态代码,我能够使远程域工作。我使用这篇文章中的代码创建了一个 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 的状态码。

于 2009-08-19T18:55:40.027 回答
1

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

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

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

  readonly attribute unsigned short status;
  readonly attribute DOMString statusText;
  DOMString getResponseHeader(DOMString header);
  DOMString getAllResponseHeaders();
  readonly attribute DOMString responseText;
  readonly attribute Document responseXML;
于 2010-05-06T23:42:38.457 回答
0

您应该能够使用 getResponseHeader() 方法获取任意标头。

对于 jQuery,您可以尝试:

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

警告:未测试

于 2009-07-19T01:07:25.193 回答