Lektion 7: Webservice / REST Martin Guggisberg Informatik Universität Basel Martin.Guggisberg@... WT-7-1 Information zweiten Hälfte des Semester Lektion Datum WEBTECHNOLOGIEN Web Data Management L8 Dienstag, 8. November 11 Bearbeiten der Übungsaufgaben KH 119 Vorstellung der Projekte L9 Dienstag, 15. November 11 L10 Dienstag, 22. November 11 L11 Dienstag, 29. November 11 L12 Dienstag, 6. Dezember 11 L13 Dienstag, 13. Dezember 11 L14 Dienstag, 20. Dezember 11 Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Vorlesung, Schanzenstrasse 46, Seminarraum 408 (4.OG) Arbeiten an den Projekten Arbeiten an den Projekten Arbeiten an den Projekten Arbeiten an den Projekten Arbeiten an den Projekten Arbeiten an den Projekten WT-7-2 1
Lernziele und Inhalt Übersicht SOAP Webservice & REST Webservice Sie können externe Datenquellen in einem Programm nutzen 1. Webservice W3C 2. REST Webservice 3. Beispiele 1. Local.ch 2. TWITER 3. WIKI 4. Last.Fm WT-7-3 Paradigmawechsel Programmable Web WT-7-4 2
SOA: Service Oriented Architecture SOA ist ein Software Architektur Konzept Orchestrierung von Diensten (nicht hierarchisch) definiert Schnittstellen mit Protokollen und Funktionalität SOA Prinzipien Wiederverwendung Modularität Kombinierbarkeit Komponentisierung Interoperabilität WT-7-5 Webservice W3C WEB OF SERVICES http://www.w3.org/ Web of Services refers to message based design frequently found on the Web and in enterprise software. The Web of Services is based on technologies such as HTTP, XML, SOAP, WSDL, SPARQL, and others. WT-7-6 3
WS Prinzip SOAP Simple Object Access Protocol (remote invocation) WSDL: Web Service Definition Language (service characteristics) UDDI: Universal Description, Discovery, and Integration (directory) WT-7-7 SOAP UDDI Definiert das Protokoll für Client-Server-Interaktion Service User SOAP Service Provider RPC-Stil (request response) Benutzt XML Nutzt HTTP als Transport- Layer-Protokoll Fehler- und Ausnahmebehandlung WT-7-8 4
SOAP http://www.w3.org/tr/soap/ Envelope, Header (optional), Body <soap:envelope xmlns:soap= http://sche.../"> <soap:header> <wig:credentials soap:mustunderstand="1"> <username>wig</username> <password>giw03</password> </wig:credentials> </soap:header> <soap:body> <wig:opendoor xmlns:x="urn:unibas:fgb"> <position x= 34 y= 356 /> <door>seminar-room</door> </wig:opendoor> </soap:body> </soap:envelope> WT-7-9 Beispiel WS für das Ei ausbrüten WT-7-10 5
SOAP Client Java, C#, VB SOAP envelope SOAP header (optional) Header block Header block SOAP over HTTP Web server SOAP server AXIS Web service Web service Web service SOAP body (required) Message body WT-7-11 Webdienste suchen http://webservices.seekda.com/ WT-7-12 6
REST Representational State Transfer Der Begriff stammt aus der Dissertation von Roy Fielding aus dem Jahr 2000. Ziel von REST ist es, durch eine Rückbesinnung auf grundlegende Web Technologien die Implementierung verteilter, web basierter Systeme zu vereinfachen. REST ist kein W3C Standard HTTP (Transport Mechanismus) URL (Eindeutige Adressierung) XML/HTML/GIF/ JPEG (Daten Repräsentation) text/xml, text/html, image/gif, image/jpeg (MIME Types) WT-7-13 REST Prinzipien Alle Dinge bekommen eine ID Verbindet Dinge miteinander Benutzt Standardmethoden und Protokolle Zustandslose Kommunikation WT-7-14 7
REST Dienst von local.ch http://developer.local.ch/en/api/city Suche nach Städten, die mit B beginnen http://extapi.local.ch/0/cities.xml?q=b&limit=3 <?xml version="1.0"?> <response status="ok"> <cities> <city name="basel" size="89949" x1="7.531579" y1="47.5231" x2="7.632765" y2="47.599422"/> <city name="bern" size="76106" x1="7.309984" y1="46.917727" x2="7.485952" y2="46.979856"/> <city name="biel/bienne" size="26542" x1="7.211981" y1="47.120864" x2="7.298841" y2="47.164178"/> </cities> </response> WT-7-15 REST Dienst > RSS Wetter für Basel http://weather.yahooapis.com/forecastrss?w=781739&u=c <?xml version="1.0" encoding="utf-8" standalone="yes"?> <rss version="2.0" xmlns:yweather="http://xml.weather.yahoo.com/ns/rss/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"> <channel>... <description>yahoo! Weather for Basel-City, CH</description> <pubdate>tue, 16 Mar 2010 9:00 am CET</pubDate>... </channel> </rss> WT-7-16 8
Unterschiede zweische REST und WS WS * kommt aus Enterprise Bereich und setzt auf skalierbare Dienste (ursprünglich CORBA) REST entstand als Web Technologien, wird jedoch von grossen Unternehmen eingesetzt WT-7-17 Beispiel: Twitter / User Time GET statuses/user_timeline Resource URL http://api.twitter.com/1/statuses/user_timeline.format Response Formats Json, xml, rss, atom WT-7-18 9
Beispiel: Twitter https://api.twitter.com/1/statuses/user_timeline.xml?scr een_name=mgje&count=1 <statuses type="array"> <status> <created_at>thu Oct 27 07:26:14 +0000 2011</created_at> <id>129458869654126592</id> <text> Searching last teaser for the poster Session @ismarconf @ismar #Isar </text> <georss:point>47.56299022 7.58533962</georss:point> </coordinates> </status> </statuses> WT-7-19 Beispiel: Python / Twitter http://code.google.com/p/python twitter/ >>> import twitter >>> client = twitter.api() >>> latest_posts = client.getusertimeline("yourusername") >>> print [s.text for s in latest_posts] WT-7-20 10
Verzeichnis für API s http://www.programmableweb.com/apis WT-7-21 Popular Web Services API Amazon AWS S3 bing search API bit.ly shorten API Delicious update API Digg API ebay shopping API Facebook API login Flickr API foursquare API GeoNames API Google App Engine API Google maps API Google search API last.fm API Live Spaces API MySpace Open Search API PayPal API Posterous Twitter API Rackspace Cloud API Salesforce Soap API Twitter friend timeline API vimeo Simple API WatchMouse API Wikipedia API Yahoo Maps API Yammer oauth API YouTube feeds API WT-7-22 11
Wiki API http://de.wikipedia.org/w/api.php http://de.wikipedia.org/w/api.php?action=query&prop=categories&titles=konrad_zuse <cl ns="14" title="kategorie:bauingenieur" /> <cl ns="14" title="kategorie:deutscher" /> <cl ns="14" title="kategorie:ehrenbürger von Hoyerswerda" /> <cl ns="14" title="kategorie:entwickler eines Computersystems" /> <cl ns="14" title="kategorie:erfinder" /> <cl ns="14" title="kategorie:geboren 1910" /> <cl ns="14" title="kategorie:geschichte der Informatik" /> <cl ns="14" title="kategorie:gestorben 1995" /> <cl ns="14" title="kategorie:hünfeld" /> <cl ns="14" title="kategorie:informatiker" /> WT-7-23 Musik Informationen last.fm WT-7-24 12
API last.fm http://www.lastfm.de/api/show?service=267 WT-7-25 Datenquelle Last.fm Inhalt HTML Last.fm Server Steuerung JavaScript Darstellung CSS WT-7-26 13
Last AFM REST Anfrage http://ws.audioscrobbler.com/2.0/?method=artist.getinfo& artist=clash&api_key=xxxxxxx WT-7-27 Beispiel last.fm HTML <body onload="initialize()"> <p>ich suche bei Last.fm nach 'The Clash'...</p> <h2><div id="artist" ></div></h2> <div><img id="fm_img" src="" alt="lastfm_bild"> </div> <div id="biographie" ></div> </body> WT-7-28 14
Beispiel I, last.fm API Last_fm_ex1.html WT-7-29 Beispiel I, last.fm Initialisierung <script type="text/javascript" src="lastfm.api.md5.js"> </script> <script type="text/javascript" src="lastfm.api.js"> </script> <script type="text/javascript"> function initialize() { /* Create a LastFM object */ var lastfm = new LastFM({ apikey : '********************************', apisecret : '********************************' }); WT-7-30 15
Beispiel I, last.fm Anfrage Last_fm_ex1.html lastfm.artist.getinfo({artist: 'The Clash'},{ success: function(data){ artist=document.getelementbyid("artist"); artist.innerhtml=data.artist.name; biographie=document.getelementbyid("biographie"); biographie.innerhtml=data.artist.bio.content fm_img=document.getelementbyid("fm_img"); fm_img.setattribute("src", data.artist.image[4]['#text']); }, error: function(code, message){ alert('error'+code+message); } }); WT-7-31 Weiteres Beispiel zu last.fm API Last_fm_ex3.html WT-7-32 16
HTML Last_fm_ex3.html <body onload="initialize();"> <p>events</p> <form name="myform" action="#" > <input type="text" name="artlocation" value="basel" onkeypress="return submitenter(this,event)"/> <input type="button" name="absenden" value="absenden" onclick="search_fm();" /> </form> <h2><div id="m_location" ></div></h2> <div id="fm_events"></div> </body> WT-7-33 Search_fm() I Last_fm_ex3.html function search_fm() { lastfm.geo.getevents({location: document.myform.artlocation.value,limit: "25"}, {success: function(data){ m_location=document.getelementbyid("m_location"); m_location.innerhtml= document.myform.artlocation.value; fm_events=document.getelementbyid("fm_events"); fm_events.innerhtml=""; var len= data.events.event.length; WT-7-34 17
Search_fm() II Last_fm_ex3.html for(var i=0;i<len;i++){ var s_artists = data.events.event[i].artists["artist"] var s_headliner = data.events.event[i].artists["headliner"] var s_datum = data.events.event[i].startdate var s_ort = data.events.event[i].venue["name"] for(var j=0;j<2;j++){ var newimg=document.createelement("img"); newimg.setattribute("src", data.events.event[i].image[j]['#text']); fm_events.appendchild(newimg); } WT-7-35 Search_fm() III Last_fm_ex3.html var newd1=document.createelement("div"); var newd2=document.createelement("div"); var newbr=document.createelement("br"); } newd1.innerhtml="artist: "+s_artists; fm_events.appendchild(newd1); newd2.innerhtml="datum: "+s_datum+" Ort: "+s_ort; fm_events.appendchild(newd2); fm_events.appendchild(newbr); } }, error: function(code, message){ alert('error'+code+message);} }); WT-7-36 18