Nehmen wir an, Sie haben einen RSS-Feed wie diesen. Das Ziel ist es, diesen RSS-Feed anzufordern, ihn zu parsen und etwas Nützliches mit den darin enthaltenen Daten zu tun. RSS ist XML und mit XML ist es wohl nicht so einfach zu arbeiten wie mit JSON. Während viele APIs JSON-Antworten anbieten, ist dies bei RSS weniger üblich, obwohl es existiert.
Lassen Sie es uns erledigen.
Zuerst ist es wahrscheinlich ratsam, den Feed zu validieren. So wissen Sie zumindest, dass Sie es mit einer gültigen Antwort zu tun haben (das Parsen kann bei ungültigen Antworten fehlschlagen).
Dann müssen wir eine Netzwerkanforderung an die URL stellen, an der sich der RSS-Feed befindet. Wir verwenden die native fetch-API von JavaScript, da diese am weitesten verbreitet ist. Sie funktioniert definitiv im Browser und es scheint, dass Node eine sehr beliebte Implementierung hat.
Was wir tun werden ist
- Die URL aufrufen
- Die Antwort zuerst als Text parsen
- Dann den Text mit
DOMParser()parsen - Dann die Daten so verwenden, als hätten wir eine normale DOM-Referenz
const RSS_URL = `https://codepen.io/picks/feed/`;
fetch(RSS_URL)
.then(response => response.text())
.then(str => new window.DOMParser().parseFromString(str, "text/xml"))
.then(data => console.log(data))
Wir können unsere Arbeit in dieser Funktion erledigen. RSS ist irgendwie wie HTML, da es verschachtelte Elemente gibt. Unsere Daten werden in etwa so aussehen
<rss>
<channel>
<title>Feed Title</title>
<item>
<link>https://codepen.io/billgil/pen/ewqWzY</link>
<title>A sad rain cloud</title>
<dc:creator>Bill Gilmore</dc:creator>
</item>
<!-- a bunch more items -->
</channel>
</rss>
Wir können also <item>-Elemente mit querySelectorAll auswählen und sie durchlaufen, um zu tun, was wir wollen. Hier erstelle ich eine Reihe von <article>-Elementen als Vorlage und füge sie dann auf einer Webseite ein
fetch(RSS_URL)
.then(response => response.text())
.then(str => new window.DOMParser().parseFromString(str, "text/xml"))
.then(data => {
console.log(data);
const items = data.querySelectorAll("item");
let html = ``;
items.forEach(el => {
html += `
<article>
<img src="${el.querySelector("link").innerHTML}/image/large.png" alt="">
<h2>
<a href="${el.querySelector("link").innerHTML}" target="_blank" rel="noopener">
${el.querySelector("title").innerHTML}
</a>
</h2>
</article>
`;
});
document.body.insertAdjacentHTML("beforeend", html);
});
Hier ist eine Demo, die das zeigt
Ich habe schon immer gedacht, dass jQuery eine schöne Ajax-Bibliothek ist und es auch einige Helfer rundherum gibt. So würden Sie es mit jQuery machen.
const RSS_URL = `https://codepen.io/picks/feed/`;
$.ajax(RSS_URL, {
accepts: {
xml: "application/rss+xml"
},
dataType: "xml",
success: function(data) {
$(data)
.find("item")
.each(function() {
const el = $(this);
const template = `
<article>
<img src="${el.find("link").text()}/image/large.png" alt="">
<h2>
<a href="${el
.find("link")
.text()}" target="_blank" rel="noopener">
${el.find("title").text()}
</a>
</h2>
</article>
`;
document.body.insertAdjacentHTML("beforeend", template);
});
}
});
Wenn Sie dies auf einer Produktionsseite ernsthaft nutzen wollen, halte ich es für etwas seltsam, sich auf eine Drittanbieter-API (und ich betrachte RSS als API) zu verlassen, um wichtige Inhalte auf Ihrer Website darzustellen. Ich würde die Anfrage wahrscheinlich serverseitig zu einer bestimmten Zeit (CRON) durchführen, sie cachen und dann Ihre Frontend die Daten aus diesem Cache verwenden lassen. Sicherer und schneller.
Das ist super hilfreich! Ich habe an einer App gearbeitet, die sich auf RSS-Feeds konzentriert, und das Paket `rss-parser` auf npm verwendet, um den Inhalt eines Feeds serverseitig abzurufen und ein serialisiertes Objekt davon zu speichern. Das könnte sinnvoller sein. Prost!
Danke für die Codebeispiele. Genau das, was ich brauchte, um Mastodon-Posts einzubinden.
Mir gefällt der Beitrag, er hat mich dazu gebracht, mein Verständnis der fetch API zu vertiefen. Allerdings habe ich CORS-Probleme beim Abrufen anderer URLs. Localhost funktioniert nicht gut mit bestimmten Seiten. Und CodePen auch nicht. Wie kommt es, dass die bereitgestellte URL so gut funktioniert, andere RSS-Feeds aber nicht? Jede Hilfe dazu wäre sehr willkommen. Danke.
Sie könnten einen Proxy verwenden, um das gesamte CORS-Problem zu vermeiden.
Diesen Artikel fand ich hilfreich im Umgang mit CORS-Problemen. Option zwei (Einpacken der URL) funktioniert für mich mit fetch wie beschrieben, ist aber etwas hacky. Option drei wäre wahrscheinlich die beste, müsste aber das Beispiel neu kodiert werden.
https://medium.com/@dtkatz/3-ways-to-fix-the-cors-error-and-how-access-control-allow-origin-works-d97d55946d9
Eine Überlegung, die man hinzufügen sollte, ist, dass das Abfragen von Feeds sehr verschwenderisch ist.
Es gibt API-Dienste wie Superfeedr, die das tun und Webhooks verwenden, um normalisierte Inhalte zu senden, sobald sie veröffentlicht wurden.
Superfeedr konvertiert Feeds auch in JSON.
Die Demo scheint ab dem 13.04.2020 nicht mehr zu funktionieren.
Sieht nach einem CORS-Problem aus. Ich habe einen Fehler auf unserer Seite gemeldet, um uns darum zu kümmern.
Das Konzept und der Code haben mir sehr gut gefallen. Ich habe auch https://jsonformatter.org/rss-to-JSON für Leute wie mich gefunden, die zu faul sind
Bei der Verwendung der Fetch-Option auf der Client-Seite... habe ich bemerkt, dass im Entwicklerkonsolen das "SameSite"-Cookie-Problem nicht gesetzt ist und das Abrufen des RSS blockiert. Wie lösen Sie das unter der Annahme, dass ich keine serverseitige Technologie verwende (z. B. GitHub Pages)? Sie können keinen Body setzen, wenn Sie eine GET-Anfrage verwenden....
Ein großartiger und hilfreicher Beitrag. Ich habe gerade bemerkt, dass Sie an meinem Geburtstag gepostet haben, also dachte ich, ich hinterlasse einen Kommentar.
Ich habe dies verwendet, um RSS/XML-Podcast-Feeds zu parsen. Vielen Dank.
Funktioniert das nicht mehr? Ich kann es egal mit welchem Browser, Gerät oder RSS-Feed nicht zum Laufen bringen.