Wie man einen Webdienst in wenigen Minuten erstellt
German (Deutsch) translation by Federicco Ancie (you can also view the original English article)
Zweimal im Monat besuchen wir einige der Lieblingsbeiträge unserer Leser aus der gesamten Geschichte von Nettuts+. Dieses Tutorial wurde erstmals im Juli 2010 veröffentlicht.
Es ist eine großartige Idee, Ihre Inhalte oder Logik als Service im Web anzubieten. Für den Anfang können Sie zahlreiche Front-Ends für Ihre eigenen Informationen erstellen, ohne ständig auf die Datenbanken zugreifen zu müssen (und so die Skalierung Ihres Systems erheblich vereinfachen).
Das noch praktischere Ergebnis ist, dass Sie den Leuten im Web erlauben, mit Ihren Informationen zu spielen und Dinge zu bauen, von denen Sie noch nie geträumt haben. Viele Unternehmen verstehen, dass diese "Crowd-Sourcing-Innovation" ein Werbegeschenk ist, das zu gut ist, um es zu verpassen, weshalb es so viele großartige APIs gibt.
Die Bereitstellung einer API für die Welt ist jedoch eine ganz andere Geschichte. Sie müssen wissen, wie Sie Ihre Server skalieren, Sie müssen für die Beantwortung von Fragen durch Implementierer da sein und Sie müssen eine gute Dokumentation führen, damit die Benutzer Ihre Inhalte verwenden können. Sie müssen auch über eine gute Caching-Strategie nachdenken, um zu verhindern, dass Ihre Server in die Luft jagen, und Sie müssen einen Weg finden, den Zugriff auf Ihr System zu beschränken, um zu vermeiden, dass Benutzer es missbrauchen. Oder machen Sie?
Geben Sie YQL ein
Yahoo bietet ein System für den Zugriff auf ihre APIs, die Yahoo Query Language (YQL). YQL ist eine Sprache im SQL-Stil, die Informationen im Web in virtuelle Datenbanken umwandelt, die von Endbenutzern abgefragt werden können. Wenn Sie beispielsweise im Internet nach dem Begriff "elephant" suchen möchten, müssen Sie lediglich die folgende Anweisung verwenden:
select * from search.web where query="elephant"
Sie senden diese Anweisung an einen Datenendpunkt und erhalten sie entweder als XML, JSON oder JSON-P zurück. Sie können weitere Ergebnisse anfordern und diese filtern, indem Sie definieren, was Sie zurückerhalten möchten:
http://query.yahooapis.com/v1/public/yql ?q={yql query} &diagnostics={true|false} &format={json|xml} &callback={function name}
Mischen und Anpassen
Alle Yahoo-APIs sind über diese Schnittstelle verfügbar, und Sie können Dienste mit Unterauswahlen kombinieren. Sie können beispielsweise ein Keyword-Analyse-Werkzeug über die Zusammenfassung einer Websuche ausführen, um relevante Keyterms zu finden. Mit den unique()
Funktionen können Sie auch leicht falsch positive Ergebnisse entfernen.
select * from search.termextract where context in ( select abstract from search.web(50) where query="elephant") | unique(field="Result")
Die Ergebnisse dieser komplexeren Abfrage finden Sie hier.



Die Konsole
Der einfachste Weg, mit YQL als Verbraucher zu spielen, ist die Verwendung der Konsole unter http://developer.yahoo.com/yql/console/. Dort können Sie auf verschiedene Tabellen klicken, um eine Demo-Abfrage zur Verwendung anzuzeigen. Wenn Sie auf den desc
-Link klicken, erfahren Sie, welche Optionen Ihnen zur Verfügung stehen.
YQL-Grenzen
Die Verwendung von YQL hat einige Grenzen, die in der Dokumentation beschrieben sind. Im Wesentlichen können Sie pro IP 1.000 Mal pro Stunde auf den Open Data-Endpunkt zugreifen. Wenn Sie eine Anwendung mit oAuth authentifizieren, erhalten Sie 10.000 Treffer pro Stunde. Jede Anwendung darf 100.000 Treffer pro Tag erzielen.
Dies und das Zwischenspeichern von Ergebnissen, die YQL automatisch ausführt, bedeutet, dass die Daten nur angefordert werden, wenn sie geändert werden. Dies bedeutet, dass YQL eine Art Firewall für Anfragen an die Daten ist, die die Benutzer damit anbieten.
Seien Sie vorsichtig, wenn Sie jQuerys "$.getJSON" und eine anonyme Funktion als Rückruf verwenden. Dies kann die Caching-Fähigkeiten von YQL beeinträchtigen und die Leistung beeinträchtigen.
Erstellen von Webdiensten mit offenen Tabellen
Das wirklich Coole für Sie als Anbieter ist, dass YQL für andere Datenanbieter offen ist.
Wenn Sie der Welt eine API anbieten möchten (oder nur eine intern für sich haben möchten), können Sie dies einfach tun, indem Sie eine "offene Tabelle" schreiben, bei der es sich um ein XML-Schema handelt, das auf einen Webdienst verweist.
Die Leute machen das oft, was bedeutet, dass wenn Sie in der YQL-Konsole auf den Link "Community-Tabellen anzeigen" klicken, Sie feststellen, dass jetzt 812 statt 118 Tische zum Spielen zur Verfügung stehen (ab heute - morgen wahrscheinlich) Mehr).
Um Ihren Service in YQL zu integrieren und der Welt anzubieten, müssen Sie lediglich YQL darauf verweisen. Schauen wir uns ein einfaches Beispiel an:
Reale Anwendung: Craigslist als API
Die kostenlose Kleinanzeigen-Website Craigslist hat keine öffentliche API - was wirklich schade ist. Wenn Sie jedoch eine Suche auf der Website durchführen, werden Sie feststellen, dass die Suchergebnisse eine RSS-Ausgabe haben - was zumindest auf die API-Funktionalität hinweist. Wenn ich in San Francisco nach "schwinn Mountainbike" suche, lautet die URL der Suche:
http://sfbay.craigslist.co.uk/search/sss?format=rss&query=schwinn+mountain+bike
Dies kann in eine URL mit Variablen geändert werden, wobei die Variablen der Speicherort, die Art des gesuchten Produkts (der Abschnitt der Website) und die von Ihnen gesuchte Abfrage sind (in diesem Fall habe ich die Parameter in geschweifte Zeilen eingeschlossen Hosenträger):
http://{location}.craigslist.co.uk/search/{type}?format=rss&query={query}
Sobald Sie ein Muster wie dieses gefunden haben, können Sie mit dem Schreiben Ihrer offenen Tabelle beginnen:
<?xml version="1.0" encoding="UTF-8"?> <table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> <meta> <author>Yahoo! Inc.</author> <documentationURL>http://craigslist.org/</documentationURL> <sampleQuery>select * from {table} where location="sfbay" and type="sss" and query="schwinn mountain bike"</sampleQuery> <description>Searches Craigslist.org</description> </meta> <bindings> <select itemPath="" produces="XML"> <urls> <url>http://{location}.craigslist.org/search/{type}?format=rss</url> </urls> <inputs> <key id="location" type="xs:string" paramType="path" required="true" /> <key id="type" type="xs:string" paramType="path" required="true" /> <key id="query" type="xs:string" paramType="query" required="true" /> </inputs> </select> </bindings> </table>
Eine vollständige Beschreibung dessen, was dies alles bedeutet, finden Sie in der YQL-Dokumentation zu offenen Tabellen. Hier finden Sie eine kurze Anleitung:
- Sie beginnen mit dem XML-Prolog und einem
table
element, das auf das Schema für offene YQL-Tabellen verweist. Dadurch kann YQL Ihre Tabelle validieren. - Sie fügen ein
meta
element mit Informationen zu Ihrer Tabelle hinzu: den Autor, die URL Ihrer Dokumentation und eine Beispielabfrage. Die Beispielabfrage ist hier die wichtigste, da diese im Abfragefeld der YQL-Konsole angezeigt wird, wenn Benutzer auf Ihren Tabellennamen klicken. Dies ist der erste Schritt zur Verwendung Ihrer API - es lohnt sich also. Zeigen Sie die von Ihnen angebotenen Parameter und deren Verwendung. Der Teil{table}
wird durch den Namen der Tabelle ersetzt. - Das
bindings
element zeigt an, mit was die Tabelle verbunden ist und welche Schlüssel in einer Abfrage erwartet werden. - Sie definieren den
path
und dentype
der Ausgabe imselect
element. Die Werte für den Typ sind XML oder JSON. Mit dem Pfad können Sie nur einen bestimmten Abschnitt der Daten zurückgeben, die von der URL zurückgegeben werden, auf die Sie zugreifen. - Im Abschnitt
urls
definieren Sie die URL-Endpunkte Ihres Dienstes. In unserem Fall ist dies die parametrisierte URL von früher. YQL ersetzt die Elemente in geschweiften Klammern durch die vom YQL-Benutzer bereitgestellten Informationen. - Im Abschnitt
inputs
definieren Sie alle möglichen Schlüssel, die Endbenutzer bereitstellen können oder sollten. Jederkey
hat eineid
, einenparamType
, der entwederpath
ist, wenn der Parameter Teil des URL-Pfads ist, oderquery
, wenn er der URL als Parameter hinzugefügt werden soll. Sie definieren, welche Schlüssel obligatorisch sind, indem Sie dasmandatory
Attribut auftrue
setzen.
Und das ist alles! Durch das Zusammenstellen dieses XML-Dokuments haben Sie den ersten von drei Schritten ausgeführt, damit Ihre Webdienste Teil der YQL-Infrastruktur werden. Der nächste Schritt besteht darin, YQL mitzuteilen, wo sich Ihre Webdienstdefinition befindet. Laden Sie die Datei einfach auf einen Server hoch, z.B. http://isithackday.com/craigslist.search.xml. Anschließend verweisen Sie YQL auf den Dienst, indem Sie den Befehl use
anwenden:
use "http://isithackday.com/craigslist.search.xml" as cl; select * from cl where location"sfbay" and type="sss" and query="playstation"
Sie können dies ausprobieren und sehen, dass Sie jetzt Playstations zum Verkauf in der San Francisco Bay Area finden. Ordentlich, nicht wahr?
Logik als Service
Manchmal haben Sie überhaupt keinen Webdienst, und alles, was Sie tun möchten, ist, der Welt eine bestimmte Logik anzubieten. Ich habe neulich genau das getan. Was ich wissen wollte, ist die Entfernung zwischen zwei Orten auf der Erde. Dazu musste ich den Breiten- und Längengrad der Orte ermitteln und dann sehr clevere Berechnungen durchführen. Da ich faul bin, habe ich auf die Arbeit aufgebaut, die andere für mich geleistet haben. Um den Breiten- und Längengrad eines bestimmten Ortes auf der Erde zu ermitteln, können Sie die Yahoo Geo-APIs verwenden. In YQL können Sie dies tun mit:
select * from geo.places(1) where text="paris"
Um eine Funktion zu finden, die die Entfernung zwischen zwei Orten auf der Erde zuverlässig berechnet, habe ich einige Minuten bei Google verbracht und Chris Veness 'Implementierung der "Vincenty Inverse Solution of Geodesics on the Ellipsoid" gefunden.
YQL bietet einen ausführbaren Block in offenen Tabellen an, der serverseitiges JavaScript enthält. Anstatt die Daten einfach vom Dienst zurückzugeben, können Sie damit Informationen konvertieren, bevor Sie sie zurückgeben. In diesen JavaScript-Blöcken können Sie auch REST-Aufrufe an andere Dienste und an YQL selbst ausführen. Und das habe ich getan:
<?xml version="1.0" encoding="UTF-8"?> <table xmlns="http://query.yahooapis.com/v1/schema/table.xsd"> <meta> <sampleQuery> select * from {table} where place1="london" and place2="paris" </sampleQuery> <author>Christian Heilmann</author> <documentationURL> http://isithackday.com/hacks/geo/distance/ </documentationURL> <description> Gives you the distance of two places on earth in miles or kilometers </description> </meta> <bindings> <select itemPath="" produces="XML"> <inputs> <key id='place1' type='xs:string' paramType='variable' required="true" /> <key id='place2' type='xs:string' paramType='variable' required="true" /> </inputs> <execute><![CDATA[ default xml namespace = "http://where.yahooapis.com/v1/schema.rng"; var res = y.query("select * from geo.places(1) where text='" + place1 + "'").results; var res2 = y.query("select * from geo.places(1) where text='" + place2 + "'").results; var lat1 = res.place.centroid.latitude; var lon1 = res.place.centroid.longitude; var lat2 = res2.place.centroid.latitude; var lon2 = res2.place.centroid.longitude; var d = distVincenty(lat1,lon1,lat2,lon2); function distVincenty(lat1, lon1, lat2, lon2) { /* ... vincenty function... */ var d = d / 1000; var miles = Math.round(d/1.609344); var kilometers = Math.round(d); response.object = <distance> <miles>{miles}</miles> <kilometers>{kilometers}</kilometers> {res.place} {res2.place} </distance>; ]]></execute> </select> </bindings> </table>
- Das
meta
element ist dasselbe wie jede andere offene Tabelle. - In den
bindings
haben wir keine URL, auf die wir verweisen können, sodass wir diese weglassen können. Jetzt fügen wir jedoch einexecute
element hinzu, das sicherstellt, dass die definiertenkey
an das in diesem Block definierte JavaScript gesendet werden. - Da die Geo-API von Yahoo XML mit Namespace zurückgibt, müssen wir dem JavaScript mitteilen, um welchen Namespace es sich handelt.
- Ich führe zwei YQL-Abfragen aus dem Skript mit der Methode
y.query()
aus, wobei ich die Parameterplace1
undplace2
verwende, um die Positionen der beiden Orte zu ermitteln. Die.results
nach dem Methodenaufruf stellen sicher, dass ich die Ergebnisse erhalte. Ich speichere sie inres
bzw.res2
. - Ich erhalte dann den Breiten- und Längengrad für jedes der Ergebnisse und rufe die
distVincenty()
-Methode auf. - Ich dividiere das Ergebnis durch 1000, um die Kilometer zu erhalten, und multipliziere das Ergebnis mit der richtigen Zahl, um die Meilen zu erhalten.
- Ich beende den Skriptteil, indem ich ein
response.object
definiere, das YQL zurückgibt. Da es sich um serverseitiges JavaScript mit vollständiger E4X-Unterstützung handelt, muss ich nur das XML schreiben, das ich mit den JavaScript-Variablen zurückgeben möchte, die ich in geschweiften Klammern rendern möchte.
Wenn ich diesen Dienst benutze und ein bisschen Schnittstelle hinzufüge, kann ich jetzt leicht die Entfernung zwischen Batman und Robin anzeigen.



Mit serverseitigem JavaScript können Sie nicht nur Daten konvertieren, sondern auch ganz einfach einen Dienst anbieten, der nur aus Berechnungen besteht - ähnlich wie Google Calculator.
Aus einem bearbeitbaren Datensatz einen Webdienst machen
In den meisten Fällen möchten Sie jedoch den Benutzern ermöglichen, die Daten, die den Webdienst steuern, auf einfache Weise zu bearbeiten. Normalerweise würden wir ein CMS erstellen, die Leute darin schulen und viel Zeit damit verbringen, die Daten vom CMS ins Web zu bringen, um über YQL darauf zuzugreifen. Es kann jedoch einfacher gemacht werden.
Vor einigen Monaten habe ich eine Website namens winterolympicsmedals.com veröffentlicht, die Ihnen alle Informationen über die Olympischen Winterspiele im Laufe der Jahre zeigt.
Die Daten, die die Website steuern, wurden von The Guardian in Großbritannien in ihrem Datenblog kostenlos als Excel-Tabelle veröffentlicht. Um daraus einen bearbeitbaren Datensatz zu machen, musste ich lediglich eine Kopie in meinem eigenen Google Text & Tabellen-Repository speichern. Sie können diese Daten hier erreichen. Google Text & Tabellen ermöglicht das Teilen von Tabellenkalkulationen im Web. Durch die Verwendung von "CSV" als Ausgabeformat erhalte ich eine URL, auf die in YQL zugegriffen werden kann:



Und mit YQL können Sie CSV als Datenquelle verwenden:
select * from csv where url="http://spreadsheets.google.com/pub? key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc &hl=en&output=csv"
Sehen Sie das Ergebnis in Ihrem eigenen Browser.
Wie Sie sehen können, fügt die CSV-Tabelle der XML-Ausgabe automatisch Zeilen und Spalten hinzu. Um diesen Webdienst nützlicher und filterbarer zu machen, können Sie eine Spaltenliste bereitstellen, um die resultierenden XML-Elemente umzubenennen:
select * from csv where url="http://spreadsheets.google.com/pub? key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc&hl=en&output=csv" and columns="year,city,sport,discipline,country,event,gender,type"
Sehen Sie sich die umbenannten Spalten in Ihrem Browser an.
Auf diese Weise können Sie die Informationen filtern. Genau das habe ich getan, um winterolympicsmedals.com zu erstellen. Um beispielsweise alle Goldmedaillen von 1924 zu erhalten, gehen Sie wie folgt vor:
select * from csv where url="http://spreadsheets.google.com/pub? key=0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc&hl=en&output=csv" and columns="year,city,sport,discipline,country,event,gender,type" and year="1924" and type="Gold"</code>
Sehen Sie die Goldmedaillen von 1924 in Ihrem Browser.
Sie können also den kostenlosen Speicher von Google und die kostenlose Webdienstinfrastruktur verwenden, um kostenlose Daten in einen Webdienst umzuwandeln. Alles was Sie tun müssen, ist eine schöne Oberfläche dafür zu erstellen.
Hinzufügen Ihres Dienstes zu den Community-Tabellen von YQL
Sobald Sie Ihre offene Tabelle definiert haben, können Sie sie verwenden, indem Sie sie auf Ihrem eigenen Server hosten, oder Sie können sie vollständig hinzufügen, indem Sie sie dem YQL-Tabellen-Repository hinzufügen. Dazu müssen Sie es lediglich zum YQL-Tabellen-Repository von GitHub hinzufügen, das Sie unter http://github.com/yql/yql-tables/ finden. Eine ausführliche Hilfe zur Verwendung von Git und GitHub finden Sie in der Hilfe.
Wenn Sie eine Anfrage an das YQL-Team senden, um sie aus Ihrem Repository abzurufen, wird Ihre Tabelle getestet. Wenn alles in Ordnung ist, wird sie an http://datatables.org/ verschoben, für die die Ressource vorgesehen ist die Community-Tabelle in der YQL-Konsole.
Dies macht nicht nur das Leben anderer Entwickler interessanter, sondern ist auch eine sehr gute Werbung für Sie. Anstatt zu hoffen, Entwickler zu finden, die mit Ihren Daten spielen, bringen Sie die Daten dorthin, wo Entwickler bereits danach suchen.
Erweiterte YQL-Themen
Diese Einführung kann nur die Oberfläche dessen kratzen, was Sie mit YQL tun können. Wenn Sie die Dokumentation überprüfen, werden Sie feststellen, dass Sie zusätzlich zu diesen "gelesenen" offenen Tabellen auch einige Dienste einrichten können, in die geschrieben werden kann, und YQL bietet auch die Cloud-Speicherung Ihrer Informationen. Weitere Informationen finden Sie in der umfangreichen YQL-Dokumentation.
Zusammenfassung
Durch die Kombination offener Systeme wie YQL und Google Docs sowie einiger Kenntnisse in XML und JavaScript können Sie den Menschen in wenigen Minuten einen Webdienst anbieten. Wenn Sie Ihre Entwicklung vom Zugriff auf lokale Dateien und Datenbanken auf den Zugriff auf Dienste verlagern, ist sie in jedem Fall viel vielseitiger und Sie können jederzeit in Zukunft den Anbieter wechseln. Mit YQL können Sie Ihre Zehen in das Wasser von Webdiensten tauchen, ohne zu ertrinken, da die meiste harte Arbeit bereits für Sie erledigt wurde. Danke fürs Lesen!
Über den Autor
Christian Heilmann ist ein internationaler Entwickler-Evangelist, der für Mozilla arbeitet.