Может ли Prototype или JQuery вернуть код состояния HTTP по запросу AJAX - PullRequest
4 голосов
/ 17 июля 2009
url = "http://example.com"
new Ajax.Request(url, {
  onComplete: function(transport) {
    alert(transport.status);
  }
});

Я бы хотел, чтобы это возвращало статус 200, если сайт работает, или 500, если он не работает и т. Д. Но этот код постоянно возвращает 0.

В конечном счете, я хочу использовать функцию setinterval, которая регулярно проверяет веб-сайт на предмет состояния работоспособности.

Ответы [ 6 ]

7 голосов
/ 17 июля 2009

С 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, который вы хотите перехватить для ответа.

Надеюсь, это поможет

4 голосов
/ 19 июля 2009

Ajax-библиотеки сами не "возвращают коды состояния"; этот код является кодом ответа HTTP, возвращаемым в ответе с сервера. Код состояния 200 указывает на успех; 404 указывает «не найдено» и т. Д.

Вероятно, код ответа 0 означает, что запрос даже не был предпринят. URL запроса находится в том же домене (субдомен, если применимо), что и тот, с которого поступает страница? Если нет, то у вас могут возникнуть проблемы с политикой того же происхождения, которая не позволяет сценариям создавать произвольные запросы.

Чтобы обойти это, вам нужно будет прокси данные на стороне сервера; например, используя скрипт / обработчик фреймворка / все, что выполняет веб-запрос и передает данные обратно клиентам. Вызовите «локальный» прокси вместо удаленного источника данных.

2 голосов
/ 19 августа 2009

Мне удалось заставить удаленные домены работать, создав прокси-файл на стороне сервера для передачи кода состояния. Я использовал код в этом сообщении , чтобы создать страницу asp.net, которая просто установит код состояния страницы в код состояния веб-запроса.

Затем я использовал пример 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.

2 голосов
/ 17 июля 2009

Прототип имеет обратные вызовы onXYZ , например:

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

Однако, если сайт не работает (например, недоступен), он не вернет ошибку 500, поэтому ваш подход не очень хорош для начинающих.

1 голос
/ 07 мая 2010

Может быть полезно знать, что параметр transport в этом примере является объектом 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;
0 голосов
/ 19 июля 2009

Вы можете получить любой произвольный заголовок с помощью метода getResponseHeader ().

Для jQuery вы можете попробовать:

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

предупреждение: не проверено

...