Hur man skapar en webbtjänst på några minuter

Två gånger i månaden besöker vi några av våra läsares favoritinlägg från hela Nettuts + historien. Denna handledning publicerades först i juli 2010.

Att erbjuda ditt innehåll eller logik som en tjänst på webben är en bra idé. Till att börja med kan du bygga många frontändar för din egen information utan att behöva komma åt databaserna hela tiden (och därigenom göra skalan ditt system mycket enklare).

Den ännu mer praktiska uppkomsten är att du låter människor på webben spela med din information och bygga saker som du aldrig ens drömde om att göra. Många företag förstår att denna "publikdrivna innovation" är en freebie som är för bra att missa, varför det finns så många stora API-er runt.

Att tillhandahålla ett API till världen är dock en helt annan historia. Du behöver veta hur man skalar dina servrar, du måste vara där för att svara på frågor från implementatörer, och du måste behålla en bra dokumentation för att människor ska kunna använda ditt innehåll. Du måste också tänka på en bra caching-strategi för att hålla dina servrar från att blåsa upp och du måste hitta ett sätt att begränsa tillgången till ditt system för att undvika att människor missbrukar det. Eller gör du?


Ange YQL

Yahoo erbjuder ett system för att få tillgång till sina API: er som heter Yahoo Query Language, eller YQL. YQL är ett språk i SQL-stil som förvandlar information på webben till virtuella databaser som kan frågas av slutanvändare. Så om du till exempel vill söka på webben för termen "elefant" är allt du behöver göra för att använda följande uttalande:

välj * från search.web där fråga = "elefant"
Se resultatet som XML i din webbläsare.

Du skickar detta uttalande till en dataändpunkt, och du får tillbaka det som XML, JSON eller JSON-P. Du kan begära fler resultat, och du kan filtrera dem genom att definiera vad du vill komma tillbaka:

http://query.yahooapis.com/v1/public/yql? q = yql query & diagnostics = true | false & format = json | xml & callback = funktionsnamn

Mixa och matcha

Alla Yahoo-API: er är tillgängliga via detta gränssnitt, och du kan mixa och matcha tjänster med underval. Till exempel kan du köra ett sökordsanalysverktyg över abstrakt av en webbsökning för att hitta relevanta nyckelord. Använda unik() funktioner, kan du också enkelt ta bort falska positiva.

välj * från search.termextract där kontext i (välj abstrakt från search.web (50) där query = "elefant") | unika (fält = "Resultat")

Se resultaten från denna mer komplexa fråga här.

Konsolen

Det enklaste sättet att spela med YQL som konsument är att använda konsolen på http://developer.yahoo.com/yql/console/. Där kan du klicka på olika tabeller för att se en demosökning hur man använder den och om du klickar på desc länk du ta reda på vilka alternativ som finns tillgängliga för dig.

http://developer.yahoo.com/yql/console/

YQL gränser

Användningen av YQL har några gränser som beskrivs i dokumentationen. I huvudsak kan du komma åt den öppna dataändpunkten 1000 gånger i en timme, per IP. Om du verifierar ett program med oAuth får du 10 000 träffar i timmen. Varje ansökan är tillåten 100 000 träffar om dagen.

Detta och cachningen av resultat som YQL gör automatiskt betyder att uppgifterna bara blir begärda när den ändras. Det betyder att YQL är en brandvägg för förfrågningar på de data som människor erbjuder med det.

Var försiktig när du använder jQuery's "$ .getJSON" och en anonym funktion som dess återuppringning. Detta kan störa YQLs cache-förmågor och hindra prestanda.


Bygga webbtjänster med öppna tabeller

Den riktigt coola saken för dig som leverantör är att YQL är öppen för andra datortillhandahållare.

Om du vill erbjuda ett API till världen (eller bara ha en för dig själv internt) kan du enkelt göra det genom att skriva ett "öppet bord" som är ett XML-schema som pekar på en webbtjänst.

Människor gör det här mycket, vilket betyder att om du klickar på länken Visa samhällstabeller i YQL-konsolen kommer du att finna att det nu finns 812 istället för 118 bord att leka med (från och med idag - imorgon kommer det troligen att vara Mer).

Att få din tjänst i YQL och erbjuda den till världen allt du behöver göra är att peka YQL på den. Låt oss titta på ett enkelt exempel:


Real-World Application: Craigslist som ett API

Den gratis klassificerade webbsidan Craigslist har inget offentligt API - vilket är synd, verkligen. Men när du gör en sökning på webbplatsen hittar du att sökresultaten har en RSS-utmatning - som åtminstone pekar mot API-funktionalitet. När jag till exempel söker efter "schwinn mountainbike" i San Francisco, skulle sökadressen vara:

http://sfbay.craigslist.co.uk/search/sss?format=rss&query=schwinn+mountain+bike

Detta kan ändras till en URL med variabler, vari variablerna är platsen, typen av produkt du letar efter (vilket är delen av webbplatsen) och den fråga du sökte efter (i det här fallet lade jag parametrarna i krull tandställning):

http: // location .craigslist.co.uk / search / typ format = rss & query = query?

När du hittat ett mönster så här kan du börja skriva ditt öppna bord:

 Yahoo! Inc.http://craigslist.org/välj * från tabell där plats = "sfbay" och typ = "sss" och fråga = "schwinn mountainbike"Sökningar Craigslist.org  

För en fullständig beskrivning av vad allt det betyder kan du kolla YQL-dokumentationen på öppna bord, men här är ett snabbt genomgång:

  1. Du börjar med XML-prologen och a tabell element som pekar på schemat för YQL-öppna tabeller. Detta gör att YQL kan validera ditt bord.
  2. Du lägger till en meta element med information om ditt bord: författaren, webbadressen till din dokumentation och en provfråga. Urvalsfrågan är den viktigaste här, eftersom det här kommer att dyka upp i frågefältet i YQL-konsolen när folk klickar på ditt tabellnamn. Det är det första steget att använda ditt API - så gör det värt ett tag. Visa parametrarna du erbjuder och hur du använder dem. De tabell del kommer att ersättas med bordets namn.
  3. De bindningar Elementet visar vad bordet är kopplat till och vilka tangenter som förväntas i en fråga.
  4. Du definierar väg och den typ av produktionen i Välj element - värden för typen är XML eller JSON och sökvägen tillåter dig bara att returnera en viss del av data som returneras från den URL du åtkomst till.
  5. I webbadresser avsnitt anger du webbadressens slutpunkter för din tjänst. I vårt fall är detta den parametrerade URL-adressen från tidigare. YQL ersätter elementen i lockiga hängslen med informationen från YQL-användaren.
  6. I ingångar avsnitt definierar du alla möjliga nycklar som slutanvändarna kan eller bör tillhandahålla. Varje nyckel- har en id, en Paramtype vilket är heller väg, om parametern är en del av URL-sökvägen, eller fråga, om det ska läggas till URL-adressen som en parameter. Du definierar vilka nycklar som är obligatoriska genom att ange obligatorisk tillskriva Sann.

Och det är det! Genom att sammanställa detta XML-dokument gjorde du det första av tre steg för att få dina webbtjänster att vara en del av YQL-infrastrukturen. Nästa steg är att berätta för YQL där din webbtjänstdefinition är. Ladda bara filen till en server, till exempel http://isithackday.com/craigslist.search.xml. Då pekar du YQL på tjänsten genom att använda använda sig av kommando:

använd "http://isithackday.com/craigslist.search.xml" som cl; välj * från cl var plats "sfbay" och skriv = "sss" och fråga = "playstation"

Du kan prova detta och du ser att du nu hittar spelplatser för försäljning i San Francisco Bay Area. Snyggt, är det inte?


Logik som en tjänst

Ibland har du ingen webbtjänst alls, och allt du vill göra är att erbjuda en viss logik till världen. Jag fann mig själv göra det här just nu. Vad jag ville veta är avståndet mellan två platser på jorden. För detta behövde jag hitta platsernas latitud och longitud och göra mycket kloka beräkningar. Som jag är en lat person byggde jag på arbete som andra människor har gjort för mig. För att hitta latitud och longitud för en viss plats på jorden kan du använda Yahoo Geo API. I YQL kan du göra detta med:

välj * från geo.places (1) where text = "paris"

Prova detta själv.

För att hitta en funktion som beräknar avståndet mellan två platser på jorden på ett tillförlitligt sätt, spenderade jag några minuter på Google och fann Chris Veness implementering av "Vincenty Inverse Solution of Geodesics on Ellipsoid".

YQL erbjuder ett körbart block inne i öppna tabeller som innehåller server-side JavaScript. I stället för att helt enkelt återföra data från tjänsten kan du använda detta för att konvertera information innan du returnerar den. Du kan också göra REST-samtal till andra tjänster och till YQL själv i dessa JavaScript-block. Och det här är vad jag gjorde:

  välj * från tabell där place1 = "london" och place2 = "paris" Christian Heilmann http://isithackday.com/hacks/geo/distance/  Ger dig avståndet mellan två platser på jorden i miles eller kilometer   
  1. De meta elementet är detsamma som alla andra öppna bord.
  2. I bindningar Vi har inte en webbadress att peka på så vi kan utelämna den. Vi lägger emellertid nu till en Kör element som säkerställer att nyckel-s definieras kommer att skickas till JavaScript definieras i det här blocket.
  3. Eftersom Geo API av Yahoo returnerar namespaced XML, måste vi berätta för JavaScript vilken namnrymd det är.
  4. Jag utför två YQL-frågor från skriptet med hjälp av y.query () metod med hjälp av place1 och place2 parametrar för att få platserna för de två platserna. De .resultat efter det att metoden samtal ser till att jag får resultaten. Jag lagrar dem i res och RES2 respektive.
  5. Jag får sedan latitud och longitud för varje resultat och kallar distVincenty () metod.
  6. Jag delar upp resultatet med 1000 för att få kilometer och multiplicera resultatet med rätt antal för att få milen.
  7. Jag avslutar skriptdelen genom att definiera a response.object vilket är vad YQL kommer att återvända. Eftersom det här är server-sida JavaScript med fullt E4X-stöd behöver jag bara skriva XML-filen som jag vill återvända med JavaScript-variablerna som jag vill göra i krökta hängslen.

Genom att använda denna tjänst och lägga till lite gränssnitt till det, kan jag nu enkelt visa avståndet mellan Batman och Robin.

Med hjälp av serverns JavaScript kan du inte bara konvertera data utan även enkelt erbjuda en tjänst som bara består av beräkningar - ungefär som Google Calculator gör.


Omvandlar en redigerbar dataset till en webbtjänst

Vad du verkligen vill göra i de flesta fall är att tillåta människor att redigera data som driver webbtjänsten på ett enkelt sätt. Normalt skulle vi bygga ett CMS, vi skulle utbilda människor på det och spendera mycket tid för att få data från CMS till webben för att komma åt det via YQL. Det kan dock bli enklare men.

För några månader sedan släppte jag en webbplats kallad winterolympicsmedals.com som visar dig all information om vinter olympiska spelen under åren.

winterolympicsmedals.com

Uppgifterna som driver webbplatsen släpptes gratis av The Guardian i Storbritannien på deras Data Blog som ett Excel-kalkylblad. För att göra det till en redigerbar dataset var allt jag behövde spara en kopia till mitt eget Google Docs-arkiv. Du kan nå uppgifterna här. Med Google Dokument kan du dela kalkylark på webben. Genom att använda "CSV" som utgångsformat får jag en URL för åtkomst i YQL:

Och med YQL kan du använda CSV som en datakälla:

välj * från csv där url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv"

Se resultatet av det i din egen webbläsare.

Som du kan se lägger CSV-tabellen automatiskt rader och kolumner till XML-utmatningen. För att göra det till en mer användbar och filtrerbar webbtjänst kan du tillhandahålla en kolumnlista för att byta namn på de resulterande XML-elementen:

välj * från csv där url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv" och kolumner = "år, stad, sport, disciplin, land, händelse, kön, typ"

Se de bytte kolumnerna i din webbläsare.

Detta låter dig filtrera informationen, vilket är precis vad jag gjorde för att bygga winterolympicsmedals.com. Till exempel för att få alla guldmedaljer från 1924 gör du följande:

välj * från csv där url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv" och kolumner = "år, stad, sport, disciplin, land, händelse, kön, typ" och år = "1924" och typ = "guld"

Se guldmedaljerna 1924 i din webbläsare.

Så du kan använda gratis lagring av Google och den kostnadsfria webbtjänstinfrastrukturen för att konvertera gratis data till en webbtjänst. Allt du behöver göra är att skapa ett bra gränssnitt för det.


Lägga till din tjänst i YQLs gemenskapstabeller

När du har definierat ditt öppna bord kan du använda det genom att ta emot det på din egen server, eller du kan gå in i det hela genom att lägga till det i YQL-tabellförvaret. För att göra detta behöver du bara lägga till det i YQL-tabellagret på GitHub som finns på http://github.com/yql/yql-tables/. Omfattande hjälp om hur man använder Git och GitHub finns i deras hjälpavdelning.

Om du skickar en begäran till YQL-teamet för att dra från ditt förråd, ska de testa ditt bord, och om allt är bra med det, flyttar de över till http://datatables.org/ vilket är resursen för samhällstabellen i YQL-konsolen.

http://datatables.org/

Det gör inte bara andra utvecklares liv mer intressant, men det är också mycket bra för dig. I stället för att hoppas att hitta utvecklare att spela med dina data, tar du data till var utvecklare redan letar efter det.


Avancerade YQL-ämnen

Denna introduktion kan bara skrapa ytan på vad du kan göra med YQL. Om du kontrollerar dokumentationen hittar du att utöver dessa "läsa" öppna tabeller kan du också ställa in några tjänster som kan skrivas till och YQL erbjuder också molnlagring av din information. Kolla den omfattande YQL dokumentationen för mer.


Sammanfattning

Kombinera öppna system som YQL och Google Docs, och lite kunskap om XML och JavaScript, kan du erbjuda en webbtjänst till människor på några minuter. Under alla omständigheter kan det vara mycket mer mångsidigt att flytta din utveckling från att komma åt lokala filer och databaser för att få tillgång till tjänster, vilket gör att du kan byta leverantörer när som helst i framtiden. Med YQL kan du doppa tårna i vattnet på webbtjänster utan att drunkna eftersom det mesta av det hårda arbetet redan har gjorts för dig. Tack för att du läser!


Om författaren

Christian Heilmann är en internationell utvecklare evangelist som arbetar för Mozilla.