Hvordan lage en webtjeneste på noen få minutter

To ganger i måneden besøker vi noen av våre leseres favorittinnlegg fra hele Nettuts + historien. Denne opplæringen ble først publisert i juli 2010.

Å tilby innhold eller logikk som en tjeneste på nettet, er en god idé. Til å begynne med kan du bygge mange frontender for din egen informasjon uten å måtte ha tilgang til databasene hele tiden (og dermed gjøre skaleringen ditt mye enklere).

Den enda mer praktiske oppstarten er at du tillater folk på nettet å spille med informasjonen din og bygge ting du aldri en gang drømte om å gjøre. Mange bedrifter forstår at denne "publikumsinnhentede innovasjonen" er en freebie som er for god til å savne, og derfor er det så mange flotte APIer rundt.

Å gi en API til verden er imidlertid en helt annen historie. Du må vite hvordan du skalere dine servere, du må være der for å svare på spørsmål fra implementatører, og du må opprettholde en god dokumentasjon slik at folk kan bruke innholdet ditt. Du må også tenke på en god caching-strategi for å hindre at serverne dine blåser opp, og du må finne en måte å begrense tilgangen til systemet for å unngå at folk misbruker det. Eller gjør du?


Skriv inn YQL

Yahoo tilbyr et system for folk å få tilgang til deres APIer kalt Yahoo Query Language, eller YQL. YQL er et SQL-stilsspråk som gjør informasjon på nettet til virtuelle databaser som kan forespørres av sluttbrukerne. Så hvis du for eksempel vil søke på nettet etter begrepet «elefant», er alt du trenger å gjøre, å bruke følgende påstand:

velg * fra search.web der spørringen = "elefant"
Se resultatet som XML i nettleseren din.

Du sender denne utsagnet til et datapunktpunkt, og du får det tilbake som enten XML, JSON eller JSON-P. Du kan be om flere resultater, og du kan filtrere dem ved å definere hva du vil komme tilbake:

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

Mix og match

Alle Yahoo-APIer er tilgjengelige gjennom dette grensesnittet, og du kan mikse og matche tjenester med undervalg. For eksempel kan du kjøre et søkeordanalyseværktøy over abstrakt av et websøk for å finne relevante nøkkelord. Bruker unik() funksjoner, kan du også enkelt fjerne falske positiver.

velg * fra search.termextract hvor kontekst i (velg abstrakt fra search.web (50) hvor spørring = "elefant") | unik (felt = "resultat")

Se resultatene av dette mer komplekse spørsmålet her.

Konsollen

Den enkleste måten å spille med YQL som forbruker er å bruke konsollen på http://developer.yahoo.com/yql/console/. Der kan du klikke på forskjellige tabeller for å se en demo-spørring hvordan du bruker den, og hvis du klikker på desc lenke du finne ut hvilke alternativer som er tilgjengelige for deg.

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

YQL Limits

Bruken av YQL har noen grenser som er beskrevet i dokumentasjonen. I hovedsak kan du få tilgang til det åpne datapunktet 1000 ganger på en time, per IP. Hvis du godkjenner et program med oAuth, får du 10 000 treff i timen. Hver søknad er tillatt 100.000 treff per dag.

Dette og caching av resultater som YQL gjør automatisk betyr at dataene bare blir forespurt når det endres. Dette betyr at YQL er en type brannmur for forespørsler til dataene som folk tilbyr med det.

Vær forsiktig når du bruker jQuery's "$ .getJSON" og en anonym funksjon som tilbakeringing. Dette kan ødelegge YQLs caching evner, og hindre ytelse.


Bygg webtjenester med åpne tabeller

Den veldig kule tingen for deg som leverandør er at YQL er åpen for andre dataprodusenter.

Hvis du vil tilby en API til verden (eller bare ha en for deg selv internt), kan du enkelt gjøre det ved å skrive et "åpent bord" som er et XML-skjema som peker på en webtjeneste.

Folk gjør dette mye, noe som betyr at hvis du klikker på "Vis samfunnstabeller" -koblingen i YQL-konsollen, vil du oppdage at det nå er 812 i stedet for 118 tabeller å spille med (fra i dag - i morgen vil det nok være mer).

Å få din tjeneste i YQL og tilby den til verden alt du trenger å gjøre er å peke YQL til den. La oss se på et enkelt eksempel:


Real-World Application: Craigslist som en API

Den gratis klassifiserte annonsesiden Craigslist har ingen offentlig API - som er synd, egentlig. Men når du gjør et søk på nettstedet, finner du at søkeresultatene har en RSS-utgang - som i det minste peker mot API-funksjonaliteten. For eksempel, når jeg søker etter "Schwinn mountain bike" i San Francisco, vil nettadressen til søket være:

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

Dette kan endres til en URL med variabler, hvor variablene er plasseringen, typen produkt du leter etter (hvilket er delen av nettstedet) og spørringen du søkte etter (i dette tilfellet pakket jeg parametrene i krøllet tannregulering):

http: // plassering .craigslist.co.uk / søk / typen format = rss & query = query?

Når du har funnet et mønster som dette, kan du begynne å skrive ditt åpne bord:

 Yahoo! Inc.http://craigslist.org/velg * fra tabell hvor sted = "sfbay" og skriv = "sss" og spørring = "schwinn mountain bike"Søker Craigslist.org  

For en fullstendig beskrivelse av hva alt dette betyr, kan du sjekke YQL dokumentasjonen på åpne tabeller, men her er et raskt gjennomgang:

  1. Du starter med XML-prologoen og a bord element som peker på skjemaet for YQL åpne tabeller. Dette gjør at YQL kan validere bordet ditt.
  2. Du legger til en meta element med informasjon om bordet ditt: forfatteren, nettadressen til dokumentasjonen din og en prøveforespørsel. Eksempelforespørsmålet er det viktigste her, da dette er det som vil vises i spørringsboksen til YQL-konsollen når folk klikker på tabellnavnet ditt. Det er første skrittet til å bruke API-en din - så gjør det verdt det. Vis parametrene du tilbyr og hvordan du bruker dem. De bord del vil bli erstattet med navnet på bordet.
  3. De bindinger element viser hva bordet er koblet til og hvilke nøkler som forventes i en spørring.
  4. Du definerer sti og type av utgangen i å velge element - verdier for typen er XML eller JSON, og banen lar deg bare returnere en bestemt del av dataene som returneres fra nettadressen du har tilgang til.
  5. I webadresser delen, definerer du URL-endepunktene for tjenesten din. I vårt tilfelle er dette den parameteriserte nettadressen fra tidligere. YQL erstatter elementene i krøllete braces med informasjonen fra YQL-brukeren.
  6. I innganger avsnitt, definerer du alle mulige nøkler sluttbrukerne kan eller skal gi. Hver nøkkel har en id, en paramType som er enten sti, hvis parameteren er en del av URL-banen, eller spørsmål, hvis det skal legges til nettadressen som en parameter. Du definerer hvilke nøkler som er obligatoriske ved å angi påbudt, bindende tilskrive ekte.

Og det er det! Ved å sette sammen dette XML-dokumentet gjorde du det første av tre trinn for å få webtjenestene dine til å være en del av YQL-infrastrukturen. Det neste trinnet er å fortelle YQL hvor definisjonen av webtjenesten er. Bare last opp filen til en server, for eksempel http://isithackday.com/craigslist.search.xml. Du peker deretter YQL på tjenesten ved å bruke bruk kommando:

bruk "http://isithackday.com/craigslist.search.xml" som cl; velg * fra cl hvor plassering "sfbay" og skriv = "sss" og spørring = "playstation"

Du kan prøve dette ut, og du får se at du nå finner spillestasjoner for salg i San Francisco Bay Area. Ryddig, er det ikke?


Logikk som en tjeneste

Noen ganger har du ingen webtjeneste i det hele tatt, og alt du vil gjøre er å gi en viss logikk til verden. Jeg fant meg selv å gjøre denne veldig tingen den andre dagen. Det jeg ønsket å vite er avstanden mellom to steder på jorden. For dette behøvde jeg å finne breddegrad og lengdegrad av stedene og deretter gjøre veldig klare beregninger. Som jeg er en lat person, bygget jeg på arbeid som andre har gjort for meg. For å finne breddegraden og lengden på et bestemt sted på Jorden, kan du bruke Yahoo Geo-APIene. I YQL kan du gjøre dette med:

velg * fra geo.places (1) der text = "paris"

Prøv dette selv.

For å finne en funksjon som beregner avstanden mellom to steder på Jorden på en pålitelig måte, brukte jeg noen minutter på Google og fant Chris Veness 'implementering av "Vincenty Inverse Solution of Geodesics on the Ellipsoid".

YQL tilbyr en kjørbar blokk inne i åpne tabeller som inneholder server-side JavaScript. I stedet for å bare returnere dataene fra tjenesten, kan du bruke dette til å konvertere informasjon før du returnerer den. Du kan også gjøre REST-anrop til andre tjenester og til YQL selv i disse JavaScript-blokkene. Og dette er det jeg gjorde:

  velg * fra table hvor place1 = "london" og place2 = "paris" Christian Heilmann http://isithackday.com/hacks/geo/distance/  Gir deg avstanden til to steder på jorden i miles eller kilometer   
  1. De meta elementet er det samme som et annet åpent bord.
  2. I bindinger Vi har ikke en URL til å peke på, slik at vi kan utelate den. Vi legger imidlertid til en henrette element som sikrer at nøkkels definert vil bli sendt til JavaScript definert i denne blokken.
  3. Siden Geo-APIen til Yahoo returnerer namespaced XML, må vi fortelle JavaScript hvilket navneområde det er.
  4. Jeg utfører to YQL spørringer fra skriptet ved hjelp av y.query () metode ved bruk av place1 og place2 parametere for å få plasseringene på de to stedene. De .resultater etter at metoden kalles, sørger jeg for at resultatene blir oppnådd. Jeg lagrer dem inn res og res2 henholdsvis.
  5. Jeg får da breddegrad og lengdegrad for hvert av resultatene og ringe til distVincenty () metode.
  6. Jeg deler resultatet med 1000 for å få kilometerene og multiplisere resultatet med riktig nummer for å få miles.
  7. Jeg avslutter skriptdelen ved å definere a response.object som er hva YQL vil returnere. Siden dette er server-side JavaScript med full E4X-støtte, er alt jeg trenger å skrive XML-filen jeg vil returnere med JavaScript-variablene jeg vil gjengi i krøllete braces.

Ved å bruke denne tjenesten og legge til litt grensesnitt til det, kan jeg nå enkelt vise avstanden mellom Batman og Robin.

Ved hjelp av server-side JavaScript kan du ikke bare konvertere data, men også enkelt tilby en tjeneste som bare består av beregninger - akkurat som Google Calculator gjør.


Slår et redigerbart datasett inn i en webtjeneste

Det du egentlig vil gjøre i de fleste tilfeller er at folk skal kunne redigere dataene som driver webtjenesten på en enkel måte. Normalt ville vi bygge et CMS, vi skulle trene folk på det, og bruke mye tid på å få dataene fra CMS på nettet for å få tilgang til det gjennom YQL. Det kan gjøres enklere skjønt.

For noen måneder siden lanserte jeg et nettsted som heter winterolympicsmedals.com som viser deg all informasjon om vinter-OL gjennom årene.

winterolympicsmedals.com

Dataene som driver nettstedet ble utgitt gratis av The Guardian i Storbritannia på deres Data Blog som et Excel-regneark. For å gjøre dette til et redigerbart datasett, var alt jeg måtte gjøre lagre en kopi til mitt eget Google Dokumenter-arkiv. Du kan nå dataene her. Google Dokumenter tillater deling av regneark på nettet. Ved å bruke "CSV" som utdataformat, får jeg en nettadresse for tilgang i YQL:

Og ved å bruke YQL kan du bruke CSV som en datakilde:

velg * fra csv hvor url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv"

Se resultatet av det i din egen nettleser.

Som du kan se, tilføyer CSV-tabellen automatisk rader og kolonner til XML-utgangen. For å gjøre det til en mer nyttig og filtrerbar webtjeneste, kan du oppgi en kolonneliste for å gi nytt navn til de resulterende XML-elementene:

velg * fra csv hvor url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv" og kolonner = "år, by, sport, disiplin, land, arrangement, kjønn, type"

Se de omdøpte kolonnene i nettleseren din.

Dette gjør at du kan filtrere informasjonen, noe som jeg gjorde for å bygge winterolympicsmedals.com. For eksempel for å få alle gullmedaljer fra 1924, gjør du følgende:

velg * fra csv hvor url = "http://spreadsheets.google.com/pub? key = 0AhphLklK1Ve4dHBXRGtJWk1abGVRYVJFZjQ5M3YxSnc & hl = en & output = csv" og kolonner = "år, by, sport, disiplin, land, arrangement, kjønn, type" og år = "1924" og type = "gull"

Se gullmedaljer fra 1924 i nettleseren din.

Så du kan bruke gratis lagring av Google og gratis webtjeneste infrastruktur for å konvertere gratis data til en webtjeneste. Alt du trenger å gjøre er å lage et fint grensesnitt for det.


Legge til din tjeneste i YQLs fellesskapstabeller

Når du har definert ditt åpne bord, kan du bruke det ved å hoste det på din egen server, eller du kan gå fullt inn ved å legge det til YQL-tabellarkivet. For å gjøre dette, er alt du trenger for deg å legge det til YQL tabellen lageret på GitHub som finnes på http://github.com/yql/yql-tables/. Omfattende hjelp om hvordan du bruker Git og GitHub, finner du i hjelpeseksjonen.

Hvis du sender en forespørsel til YQL-teamet for å trekke fra depotet ditt, vil de teste bordet ditt, og hvis alt er bra med det, vil de flytte det til http://datatables.org/ som er ressurs for samfunnstabellen i YQL-konsollen.

http://datatables.org/

Dette gjør ikke bare livet til andre utviklere mer interessant, men er også veldig bra forfremmelse for deg. I stedet for å håpe å finne utviklere å spille med dataene dine, tar du med dataene til utviklere allerede ser etter det.


Avanserte YQL-emner

Denne introduksjonen kan bare skrape overflaten av det du kan gjøre med YQL. Hvis du sjekker dokumentasjonen, finner du at i tillegg til disse "les" åpne tabellene, kan du også sette opp noen tjenester som kan skrives til, og YQL tilbyr også skylagring av informasjonen din. Sjekk den omfattende YQL-dokumentasjonen for mer.


Sammendrag

Kombinere åpne systemer som YQL og Google Docs, og litt kunnskap om XML og JavaScript, kan du tilby en webtjeneste til folk om noen minutter. Under alle omstendigheter gjør det å flytte utviklingen din fra å få tilgang til lokale filer og databaser for å få tilgang til tjenester, mye mer allsidig, og lar deg bytte leverandører når som helst i fremtiden. Med YQL kan du dyppe tærne i vannet til webtjenester uten å drukne, ettersom det meste av det tøffe arbeidet allerede er gjort for deg. Takk for at du leste!


om forfatteren

Christian Heilmann er en internasjonal utvikler evangelist som arbeider for Mozilla.