2009-08-26 14 views
1

Ich verwende ein Greasemonkey-Skript, um Daten aus dem RSS-Feed http://www.instapaper.com/folder/48337/rss/11185/QBV0RZfH4KBO7GwgrR3D8b7sv90 zu ziehen und es in eine Seite mit jQuery einzufügen. Die Adresse gibt eine gültige RSS zurück, aber wenn Greasemonkey einen Ajax-Aufruf auslöst (siehe unten), gibt es immer eine leere Anfrage zurück und löst den Fehler-Callback aus. Was vermisse ich bei meinem Ajax-Anruf?jQuery.ajax Call gibt einen leeren Datencontainer zurück, aber die rohe URL funktioniert

$.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>"); 
    } 
}); 

Ich bin nicht ganz sicher, ob dies ist es, aber mein jQuery.ajax Anruf scheint als eine andere Art von HTTP-Aufruf zu erteilen, wenn ich einfach die RSS-URL in meine Adressleiste einfügen. Obwohl ich festlege, dass die Anfrage ein "GET" sein soll, scheint jQuery eine "OPTIONS" -Anfrage zu senden. Unten ist die Ausgabe, die mit Live-HTTP-Headern für den von meiner Ajax-Anforderung ausgegebenen Anruf und für die Arbeitsanforderung durch Eingabe der URL in die Adressleiste abgefangen wird.

Dieser löst den Ajax-Fehlerrückruf mit einer leeren (?) Antwort aus Objekt:

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 

Dies zeigt erfolgreich Daten im Browser (was passiert, wenn ich URL in der Adressleiste Drop):

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 

Antwort

1

Ich habe jQuery in ein unsafeWindow Objekt geladen, also vermute ich, dass mein Problem mit Greasemonkey feuern OPTIONS Anfragen bezieht sich darauf, nicht zu verwenden, die XMLHttpRequest, die jQuery verwendet.

Ich konnte erfolgreich ein GET durch Wechsel von jQuery.ajax mit einem regulären Greasemonkey GM_xmlhttpRequest Anruf ausgeben. Ich benutze immer noch jQuery in den Rückmeldungsrückrufen. Unten ist ein abgekürztes Beispiel dafür, was ich mache, wenn die alten Zeilen auskommentieren.

//$.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... 
    } 
}); 

(ich einen Teil der Antwort auf meine Frage in Stack Overflow Frage gefunden [Remote-URL lädt mit Greasemonkey und jQuery] [1].)

0

ich glaube, Sie haben ein leere Daten an den Server in der Menge passieren Datenparameter. Mit JSON können Sie das mit data: "{}" tun, aber ich bin mir nicht sicher, was das in Ihrem Fall speziell wäre. Wenn Sie eine leere Datenmenge nicht übergeben, glaube ich nicht, dass sie jemals erfolgreich abgeschlossen wird.

+0

Nun, ich versucht, aber kein Erfolg . Irgendwelche anderen Ideen da draußen? –

+0

Was genau hast du probiert? "{}" würde nicht für XML funktionieren, nehme ich an ... vielleicht nur eine leere Zeichenfolge? –

+0

Ich habe versucht "{}" und leere Zeichenfolge "" (das ist, was ich in der oben bearbeiteten Frage habe). Ich bin mir nicht sicher, was passiert, es sei denn, es hat mit dem Unterschied zwischen HTTP GET und HTTP OPTIONS zu tun. –