robert: rss laden per httpRequest

Hallo,

ich versuche grad ein rss-feed per Javascript auszulesen, habe aber so einige Probleme damit.

Also ich habe es schon geschafft eigene Dateien per Request auszulesen. Das waren bislang PHP-Dateien, die ein Dokument mit header 'Content-Type: text/xml' ausgegeben haben. Diese habe ich mit folgendem Script geladen:

url = "datei.php";
vars="action=save_cat";

http.open("POST", url, true);
http.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
http.send(vars);
http.onreadystatechange = meine_funktion;

Das hat wie gesagt wunderbar geklappt. Nun möchte ich aber gern den Newsfeed von zdf.de laden. Dazu habe ich das Ganze, nachdem es mit meinem Ursprungs-Script nicht lief, in folgendes umkonstruiert:

url='http://www.zdf.de/ZDFmediathek/rss/4/0,4149,2351716,00.xml';

http.open("get", url);
http.setRequestHeader("Content-Type", "text/xml");
http.send(null);
http.onreadystatechange = meine_funktion;

Das kuriose dabei ist, das es im IE funktioniert. Jedoch nur mit einer komischen Sicherheitsmeldung, was auch nicht sein sollte. Ich schätze, dass es irgendwas mit den Headern zu tun, aber was, dass weiss ich nicht.

Hat da vielleicht einer eine Idee für mich.

Grüße
Robert

  1. Hallo,

    Das XMLHttpRequest darf nur auf Dateien zugreifen die auf der gleichen Domain liegen wie die Seite von der esaufgerufen wurde.

    Grüße
    Jeena Paradies

    1. Okay, das klingt nachvollziehbar. Danke für die Aufklärungsarbeit.

      Dann werde ich wohl den Umweg über php gehn.

      Danke euch beiden
      Robert

      1. Hallo nochmal,

        also irgendwie scheitere ich grad auch daran per PHP die XML Datei entgegenzunehmen und zum auslesen über den httpRequest bereitzustellen. Ich verstehs nich. Vielleicht diesmal irgendein Codierungsfehler?

        Das "Zeug" sieht so aus:

        JavaScript:
        http.open("POST", "load_feed.php", true);
        http.setRequestHeader("Content-Type", "text/xml");
        http.send("url=http://www.zdf.de/ZDFmediathek/rss/4/0,4149,2351716,00.xml");
        http.onreadystatechange = post_news;

        Und die load_feed.php:
        $fp = join ('', file($_POST['url']));
        echo $fp;

        Vielleicht kann ja einer was damit anfangen?

        Gruß
        Robert

        1. hi,

          Vielleicht diesmal irgendein Codierungsfehler?

          Welche Angaben zur Kodierung hast du denn gemacht?

          Und die load_feed.php:
          $fp = join ('', file($_POST['url']));
          echo $fp;

          Aha, abweichend von den PHP-Defaults also _gar keine_.

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. danke für die antwort, aber hilft mir nicht so richtig weiter. Ich mein das RSS Feed hat doch schon einen header, der müsste ja auch okay sein. Und der Request sagt, dass da text/xml kommt.

            Hiiiilllllllllllllllllllfe!!!
            Ich verstehs nicht

            Robert

            1. hi,

              Ich mein das RSS Feed hat doch schon einen header, der müsste ja auch okay sein.

              Der Response Header wird vom Server an den Client geschickt.
              Wer ist in deinem Falle der Client?

              Und der Request sagt, dass da text/xml kommt.

              Und wie lautet jetzt deine Problembeschreibung?
              (Etwas mehr als "funktioniert nicht" bitte.)

              Hiiiilllllllllllllllllllfe!!!

              Ja, so kommen wir sicher weiter.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
        2. Hallo,

          also irgendwie scheitere ich grad auch daran per PHP die XML Datei entgegenzunehmen und zum auslesen über den httpRequest bereitzustellen. Ich verstehs nich. Vielleicht diesmal irgendein Codierungsfehler?
          http.open("POST", "load_feed.php", true);
          http.setRequestHeader("Content-Type", "text/xml");

          Du schickst hier kein text/xml an den Server, sondern application/x-www-form-urlencoded.

          http.send("url=http://www.zdf.de/ZDFmediathek/rss/4/0,4149,2351716,00.xml");
          http.onreadystatechange = post_news;

          Wieso eigentlich ein POST-Request? Du willst nicht Daten zum Server senden (naja), sondern Daten abfragen anhand des Parameters url.
          Gut, dafür nimmst du einen einfachen GET-Request mit dem Query-String ?url=...

          Und die load_feed.php:
          $fp = join ('', file($_POST['url']));
          echo $fp;

          Ein PHP-Script sendet standardmäßig den Header Content-Type: text/html.

          Du holst aber eine RSS-Datei von einem fremden Server und gibst sie dann im PHP-Script aus und damit an den Browser weiter.

          Der sollte das RSS aber nicht als text/html bekommen, sondern z.B. als application/xml. Mit header() kannst du PHP dazu bringen, den entsprechenden Header Content-Type: application/xml zu senden.

          Die Kodierungsfrage ist eine ganz andere.
          Wenn du eine Ressource von einem anderen Server mittels file() einliest, dann weißt du nicht, welche Kodierung der ZDF-Server mit seiner Antwort gesendet hat. Du bist also darauf angewiesen, dass in der RSS-Datei eine Kodierungsangabe in Form einer XML-Deklaration drinsteht. Das ist beim ZDF-Feed der Fall, also wird der Browser damit klarkommen, aber andere Feeds enthalten gerne keine oder auch falsche Kodierungsangaben.

          Mathias

          1. Hi Mathias,

            das mit "application/x-www-form-urlencoded" im Request und "application/xml" im Header hat geklappt. Wunderbar.

            Danke

            Gruß
            Robert

  2. Hallo,

    Nun möchte ich aber gern den Newsfeed von zdf.de laden. Dazu habe ich das Ganze, nachdem es mit meinem Ursprungs-Script nicht lief, in folgendes umkonstruiert:

    url='http://www.zdf.de/ZDFmediathek/rss/4/0,4149,2351716,00.xml';

    http.open("get", url);
    http.setRequestHeader("Content-Type", "text/xml");

    Ein Content-Type-Header bei einem GET-Request ist widersinnig.

    Das kuriose dabei ist, das es im IE funktioniert. Jedoch nur mit einer komischen Sicherheitsmeldung, was auch nicht sein sollte.

    Die sogenannte Same Origin Policy verhindert, dass ein JavaScript Daten von anderen Servern laden kann bzw. auf Dokumente von fremden Servern zugreifen kann. (Ausnahme: Mit <script> eingebundene Scripte.)

    Sprich, mit XMLHttpRequest kannst du keine RSS-Feeds von beliebigen Servern laden, sondern nur exakt von dem Server, auf dem das JavaScript ausgeführt wird.

    Du kannst höchstens ein (entsprechend geschütztes) Script auf deinem Server installieren, welches eine URL entgegennimmt, diese vom fremden Server abrufen und dann an den Browser weitergibt. Besonders für das Abrufen von RSS-Feeds gibt es schon einige Fertiglösungen - an den Browser wird dann aber letztlich kein bloßes RSS mehr gesendet. Online-Newsreader wie Bloglines und der Google Reader arbeiten ähnlich.

    Mathias

    1. Hell-O!

      Sprich, mit XMLHttpRequest kannst du keine RSS-Feeds von beliebigen Servern laden, sondern nur exakt von dem Server, auf dem das JavaScript ausgeführt wird.

      Es gibt zwar Server Side Javascript (setzt das überhaupt noch jemand ein?), aber du wolltest sicher darauf hinaus, dass der Server, der die Datei mit der AJAX-Anwendung ausliefert, identisch mit dem sein muss, an den die Anfrage über AJAX gerichtet werden soll.

      Siech*Kümmelspalter*fred

      1. Moin,

        Sprich, mit XMLHttpRequest kannst du keine RSS-Feeds von beliebigen Servern laden, sondern nur exakt von dem Server, auf dem das JavaScript ausgeführt wird.

        Es gibt zwar Server Side Javascript (setzt das überhaupt noch jemand ein?), aber du wolltest sicher darauf hinaus, dass der Server, der die Datei mit der AJAX-Anwendung ausliefert, identisch mit dem sein muss, an den die Anfrage über AJAX gerichtet werden soll.

        Es reicht doch, wenn der Server PHP, Perl, Python oder sonstwas spricht :)

        Tschau,
        Martin