Newbie: XMLhttpRequest Fehler

Hi,

ich habe gerade angefangen JavaScript ein wenig zu vertiefen und mich mit Freude auf AJAX gestürmt.

var req = new XMLHttpRequest();
alert(req.readyState); //Gibt 0 aus
req.open(
    "GET",
    "http://de.wikipedia.org/w/api.php" +
        "action=query&" +
        "titles=Internet",
    true);
req.send();
alert(req.readyState); // Gibt 1 aus

Das ist mein Code. das erste readyState verstehe ich, Objekt ist bereit, aber ich hab ja noch nichts gemacht. Das zweite readyState verstehe ich aber nicht mehr. Ich wollte einfach ein paar Daten von Wikipedia dynamisch nachladen. Habe nachgeguckt wie das mit deren API funktioniert (http://www.mediawiki.org/wiki/API:Query/de) und ausprobiert. Das req.open ist doch so richtig, oder? Und wenn ich anschließend req.send() eingebe, wieso kommt dann readyState 1, ich dachte ich hab es abgesendet?

Danke für eure Hilfe.

  1. Hallo,

    var req = new XMLHttpRequest();

    alert(req.readyState); //Gibt 0 aus
    req.open(
        "GET",
        "http://de.wikipedia.org/w/api.php" +
            "action=query&" +
            "titles=Internet",

    // der Querystring muss mit einem Fragezeichen vom Pfad abgetrennt werden

    true);

    // Du sendest also einen asynchronen Request

    req.send();
    alert(req.readyState); // Gibt 1 aus

    
    >   
    > Das ist mein Code. das erste readyState verstehe ich, Objekt ist bereit, aber ich hab ja noch nichts gemacht. Das zweite readyState verstehe ich aber nicht mehr. Ich wollte einfach ein paar Daten von Wikipedia dynamisch nachladen. Habe nachgeguckt wie das mit deren API funktioniert (http://www.mediawiki.org/wiki/API:Query/de) und ausprobiert. Das req.open ist doch so richtig, oder? Und wenn ich anschließend req.send() eingebe, wieso kommt dann readyState 1, ich dachte ich hab es abgesendet?  
      
    Sieh Dir mal bitte <http://de.wikipedia.org/wiki/XMLHttpRequest> und <http://www.w3.org/TR/XMLHttpRequest/> an!  
      
      
    Gruß aus Berlin!  
    eddi
    
    1. // der Querystring muss mit einem Fragezeichen vom Pfad abgetrennt werden

      Stimmt, hatte ich übersehen.

      // Du sendest also einen asynchronen Request

      Ich hab nun auf synchron umgestellt, um zu warten, bis die Antwort kommt, also so:

      var req = new XMLHttpRequest();
      alert(req.readyState); // Gibt 0 aus
      req.open(
          "GET",
          "http://de.wikipedia.org/w/api.php?" +
              "action=query&" +
              "titles=Beispiel&" +
              "prop=info",
          false);
      req.send(null);
      alert(req.responseXML);

      Allerdings, passiert immer noch nichts. Rufe ich die URL normal auf, erscheint folgendes:

      You are looking at the HTML representation of the XML format.
      HTML is good for debugging, but probably is not suitable for your application.
      See complete documentation, or API help for more information.
      <?xml version="1.0"?>
      <api>
        <query>
          <pages>
            <page pageid="3541279" ns="0" title="Beispiel" touched="2010-01-05T06:01:54Z" lastrevid="63884158" counter="0" length="253" />
          </pages>
        </query>
      </api>

      Auf das möchte ich ja später zugreifen. Nachdem der Request abgesendet wird, passiert aber nichts mehr. Lasse ich mir den Status per alert ausgeben, kommt gar kein alert und das alert reg.responseXML, wo ich mir ja die Antwort erhoffe, bleibt ebenfalls aus.

      1. Re:

        Soweit ist der Code erstmal korrekt. Bitte sieh Dir http://de.wikipedia.org/wiki/Same_Origin_Policy an!

        Gruß aus Berlin!
        eddi

        1. Soweit ist der Code erstmal korrekt. Bitte sieh Dir http://de.wikipedia.org/wiki/Same_Origin_Policy an!

          Hm, danke. Das wusste ich garnicht. (Ja, bin Anfänger). Ich habs gelesen und verstanden, nun frage ich mich aber, was ich machen soll. Eigentlich will ich ja nur testen, wie man Extensions für Chrome schreibt. Das offizielle Beispiel macht das mit Flickr (http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.html?content-type=text/plain). Ich wollte nun anfangen eine Extension für Wikipedia zu basteln.

          Was kann ich aber nun machen, damit SOP nicht greift? Ich meine ich muss so oder so auf die API von Wikipedia zugreifen, die Domains, werden da niemals übereinstimmen. Was soll ich nun bitte machen?

          Übrigens erhalte ich in Firebug: uncaught exception: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsIXMLHttpRequest.send]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: file:///C://test.html :: <TOP_LEVEL> :: line 11" data: no]

          Danke für deine Hilfe.

          1. Re:

            … (Ja, bin Anfänger). … Eigentlich will ich ja nur testen, wie man Extensions für Chrome schreibt. … Ich wollte nun anfangen eine Extension für Wikipedia zu basteln.

            Du hast Dir verdammt große Ziele gesteckt.

            Was kann ich aber nun machen, damit SOP nicht greift?

            Offen gestanden kenne ich mich mit Chrome nicht aus. Ich habe aber einige Erfahrungen mit Erweiterungen von Mozilla und XUL-Scripts. Vermutlich wird Chrome auch Möglichkeiten kennen, Scripte unter verschiedenen Rechten auszuführen. Im Wesentlichen gibt es da die Rechte, die Scripte einer Website, des Nutzers und des Browsers selbst haben. Ich gehe davon aus, dass Extensions ebenso wie beim Mozilla die Möglichkeit haben, diese Rechte vorab zu wählen. Suche also in der Dokumentation von Chrome nach Artikeln, die dieses Thema abhandeln!

            Gruß aus Berlin!
            eddi

            1. Du hast Dir verdammt große Ziele gesteckt.

              Alles andere wäre langweilig.

              Offen gestanden kenne ich mich mit Chrome nicht aus. Ich habe aber einige Erfahrungen mit Erweiterungen von Mozilla und XUL-Scripts. Vermutlich wird Chrome auch Möglichkeiten kennen, Scripte unter verschiedenen Rechten auszuführen. Im Wesentlichen gibt es da die Rechte, die Scripte einer Website, des Nutzers und des Browsers selbst haben. Ich gehe davon aus, dass Extensions ebenso wie beim Mozilla die Möglichkeit haben, diese Rechte vorab zu wählen. Suche also in der Dokumentation von Chrome nach Artikeln, die dieses Thema abhandeln!

              Für alle, die das gleiche Problem hatten wie ich:
              "Regular web pages can use the XMLHttpRequest object to send and receive data from remote servers, but they're limited by the same origin policy. Extensions aren't so limited." (code.google.com)
              Ich hatte lediglich in der manifest.json einen Fehler, auf den ich über SOP aufmerksam geworden bin.
              Trotzdem danke für deine Hilfe - merken: Chrome Extensions unterliegen nicht diesen Beschränkungen!

          2. moin,

            Was kann ich aber nun machen, damit SOP nicht greift?

            Ganz einfach, die Daten nicht clientseitig sondern serverseitig holen: das XHR-Objekt schickt den Request nicht an Wiki (hier würde die SOP greifen und das verbieten) sondern an seinen eigenen Server und wo der seine Daten herkriegt ist dann egal. Hier gilt es jedoch, eine etwaige Secure Policy beim Provider zu beachten.

            Hotti