Вызов jQuery.ajax возвращает пустой контейнер данных, но необработанный URL работает - PullRequest
1 голос
/ 26 августа 2009

Я использую скрипт Greasemonkey, чтобы извлечь данные из RSS-канала http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90 и вставить их на страницу с помощью jQuery. Адрес возвращает действительный RSS, но когда Greasemonkey запускает Ajax-вызов (см. Ниже), он всегда возвращает пустой запрос и вызывает обратный вызов ошибки. Чего мне не хватает в моем вызове Ajax?

$.ajax({
  url: "http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90",
  dataType: "xml",
  data: "",
  type: "GET",
  success: function (data){
    var classString = "";

    $("item",data).each(function (i) {
      classString = classString + "<li><a href='" + $("link",this).text() + "'>" + $("title",this).text() + "</a></li>";
    });

    var message = "<div id='classes'><h2>Class Links</h2><ul>" + classString + "</ul></div>";
    $("#sidelinks").prepend(message);
  },
  error: function (XMLHttpRequest, textStatus, errorThrown) {
    $("#sidelinks").prepend("<div id='classes'><h2>Class Links</h2><p>There was an error accessing class link information.</p></div>");
  }
});

Я не совсем уверен, так ли это, но мой jQuery.ajax вызов, похоже, вызывает другой тип HTTP-вызова, нежели когда я просто вставляю URL-адрес RSS в панель адресов. Несмотря на то, что я указываю, что запрос должен быть «GET», jQuery, похоже, отправляет запрос «OPTIONS». Ниже приведен вывод в ловушку с заголовками Live HTTP для вызова, отправленного моим Ajax-запросом, и для рабочего запроса путем ввода URL-адреса в адресную строку -

Этот объект запускает ответный вызов ошибки Ajax с пустым (?) Объектом ответа:

http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90

OPTIONS /folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90 HTTP/1.1
Host: www.instapaper.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive
Origin: http://home.bju.edu
Access-Control-Request-Method: GET
Access-Control-Request-Headers: x-requested-with

HTTP/1.x 200 OK
Date: Thu, 27 Aug 2009 15:16:53 GMT
Server: Apache
P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
Vary: Accept-Encoding
Content-Type: text/xml; charset=utf-8
Content-Length: 1210
Age: 0

Это успешно отображает данные в браузере (что происходит, когда я перетаскиваю URL в адресную строку):

http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90

GET /folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90 HTTP/1.1
Host: www.instapaper.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

HTTP/1.x 200 OK
Date: Thu, 27 Aug 2009 15:18:04 GMT
Server: Apache
P3P: CP="ALL ADM DEV PSAi COM OUR OTRo STP IND ONL"
Vary: Accept-Encoding
Content-Type: text/xml; charset=utf-8
Content-Length: 1210
Age: 0

Ответы [ 3 ]

1 голос
/ 28 августа 2009

Я загружал jQuery в объект unsafeWindow, поэтому я предполагаю, что моя проблема с запуском запросов OPTIONS Greasemonkey связана с тем, что ему не разрешено использовать XMLHttpRequest , который использует jQuery.

Мне удалось успешно выполнить GET, переключившись с использования jQuery.ajax на обычный вызов Greasemonkey GM_xmlhttpRequest. Я все еще использую jQuery в ответных обратных вызовах. Ниже приведен сокращенный пример того, что я делаю с закомментированными старыми строками.

//$.ajax({
GM_xmlhttpRequest({
    url: "http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90",
    //dataType: "xml",
    //data: "",
    //type: "GET",
    method: "GET",
    //success: function (data){
    onload: function (responseObject){
          var data = responseObject.responseText;

          // Same code as in my question, use some jQuery selectors here to parse the data...
    },
    //Error: function (XMLHttpRequest, textStatus, errorThrown) {
    onerror: function () {
      // Same code as in my question...
    }
});

(часть ответа на мой вопрос я нашел в вопросе переполнения стека [Загрузить удаленный URL с помощью Greasemonkey и jQuery] [1] .)

0 голосов
/ 17 апреля 2016

Причина ошибки - та же политика происхождения. Это только позволяет вам делать запросы XMLHTTP к вашему собственному домену.

(GM_xmlhttpRequest разрешает запросы за пределами вашего домена обязательно добавьте: // @grant GM_xmlhttpRequest)

Смотрите ответ здесь:

jQuery $ .ajax (), $ .post отправляет «OPTIONS» как REQUEST_METHOD в Firefox

0 голосов
/ 26 августа 2009

Я считаю, что вы должны передать пустой набор данных на сервер в параметре данных. Используя JSON , вы можете сделать это с помощью data: "{}", но я не уверен, что именно будет в вашем случае. Если вы не передадите ему пустой набор данных, я не думаю, что он когда-нибудь успешно завершится.

...