1

私は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.ajaxRSSURLをロケーションバーに貼り付けるだけの場合とは異なるタイプのHTTP呼び出しを発行しているようです。リクエストを「GET」に指定しましたが、jQueryは「OPTIONS」リクエストを送信しているようです。以下は、私のAjaxリクエストによって発行されたコールとロケーションバーにURLを入力することによる作業リクエストのライブHTTPヘッダーでトラップされた出力です--

これは、空の(?)応答オブジェクトを使用して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
4

3 に答える 3

1

jQuery を unsafeWindow オブジェクトにロードしていたので、Greasemonkey が OPTIONS リクエストを発行する際の問題は、jQuery が使用するXMLHttpRequestの使用が許可されていないことに関連していると推測しています。

jQuery.ajax通常の GreasemonkeyGM_xmlhttpRequest呼び出しの使用から使用に切り替えることで、GET を正常に発行できました。私はまだ応答コールバックで 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...
    }
});

(Stack Overflow question [Load remote URL with Greasemonkey and jQuery][1]で私の質問に対する回答の一部を見つけました。)

于 2009-08-28T15:03:09.623 に答える
0

データパラメータで空のデータセットをサーバーに渡す必要があると思います。JSONを使用すると、でそれを行うことができますが、data: "{}"具体的にはどうなるかわかりません。空のデータセットを渡さないと、正常に完了することはないと思います。

于 2009-08-26T18:24:50.653 に答える
0

エラーの理由は、同一オリジン ポリシーです。独自のドメインに対してのみ XMLHTTPRequests を実行できます。

(GM_xmlhttpRequest は、ドメイン外のリクエストを許可します: // @grant GM_xmlhttpRequest を必ず追加してください)

ここで答えを見てください:

jQuery $.ajax()、$.post が Firefox で REQUEST_METHOD として "OPTIONS" を送信する

于 2016-04-17T09:38:57.527 に答える