Práctica 7: Invocación Web Services con REST Aplicaciones Telemáticas II Introducción Los Web Services permiten realizar aplicaciones distribuidas, usando las ventajas que nos proporciona el protocolo HTTP. Básicamente, los Web Services son la transferencia de información a través de HTTP, obteniendo una respuesta por parte del servidor, y permite la comunicación entre máquinas con un protocolo definido. En esta práctica invocaremos web services de Yahoo! utilizando Java y la arquitectura REST. REST corresponde a un estilo de arquitectura de sistemas de red. La Web se compone de recursos, un recurso corresponde a cualquier item de interes, una representación de un recurso de obtiene a través de una URL. Los servicios SOAP son a veces más complejos de configurar y dificiles de usar, una alternativa más simple es REST, que corresponde a una formalización de las reglas básicas del protocolo HTTP que se aplican a Web services. REST es menos formal que SOAP y solo se refiere a transferencia de documentos sobre HTTP sin un envoltorio como el caso de SOAP. No es necesario un framework de programación para implementar un cliente o un servidor en REST, pero esto implica que todo el manejo/procesamiento de XML/HTML es responsabilidad del implementador. La elección entre utilizar una arquitectura u otra corrresponderá a la aplicación en desarrollo, para muchas empresas el uso de SOAP es una mejor elección debido a que los problemas de transacciones, seguridad o coordinación dependeran del framework de programación y no de la implementación. Puede descargar desde la página del curso en el Campus Global un fichero zip con los ficheros jar que necesitará para compilar y ejecutar su cliente. Ejemplo Yahoo! Web services, permite acceder a contenidos y servicios de Yahoo! en cualquier lenguaje de programación. Para poder utilizar estos Web services es necesario obtener un ID de aplicación, que corresponde a un identificador unico de nuestra aplicación. Para esta práctica pueden utilizar alguno de los siguientes IDs: 1
CTVIC3V34EhHC0vUcJGwDAPlk9msAVIRnUXIY4czn02zVKBm2938ixnn14.1qmH10TADw-- KQCjG6LV34EnMfET4swu_xRF2qmYFRUDvmGTsjCwrn9hi.YFqYFM7AavqGERGUDptLLhig-- Para obtener un ID propio visitar: http://search.yahooapis.com/webservices/register_application Uno de los Web services disponibles, entrega el resultado de la búsqueda de una query en Yahoo!. La especificación del Web service se encuentra en: http://developer.yahoo.com/search/web/v1/websearch.html La URL para realizar el request corresponde a: http://search.yahooapis.com/websearchservice/v1/websearch Parámetros de request: La URL de request acepta muchos parámetros, los que usaremos en este ejemplo son los siguientes: Parámetro Valor Descripción appid string (obligatorio) ID de la aplicación query string (obligatorio) La query a buscar. results integer (10 por defecto) número de resultados. Implementación El siguiente código Java implementa una llamada al Web service WebSearchService para la query supermercado. import java.io.*; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.*; public class ClienteREST { public static void main(string[] args) throws Exception { String request = "http://api.search.yahoo.com/websearchservice/v1/websearch?" + "appid=id&query=supermercado&results=3"; // crear cliente HTTP HttpClient client = new HttpClient(); GetMethod method = new GetMethod(request); // esto es necesario desde pc s UPF HostConfiguration conf = new HostConfiguration(); conf.setproxy("proxy.upf.es", 8080); // enviar request int statuscode = client.executemethod(conf, method); if (statuscode!= HttpStatus.SC_OK) { 2
System.err.println("Method failed: " + method.getstatusline()); InputStream rstream = null; // obtener respuesta rstream = method.getresponsebodyasstream(); // imprimir la respuesta (XML) BufferedReader br = new BufferedReader(new InputStreamReader(rstream)); String line; while ((line = br.readline())!= null) { System.out.println(line); br.close(); Compilación %> javac -classpath.:commons-logging-1.1.1.jar:commons-codec-1.3.jar: commons-httpclient-3.1.jar:jdom.jar ClienteREST %> java -classpath.:commons-logging-1.1.1.jar:commons-codec-1.3.jar: commons-httpclient-3.1.jar:jdom.jar CLienteREST Ejercicio Debe implementar un cliente en java que permita el siguiente dialogo: 1. Buscar en Web 2. Buscar Cancion 3. Buscar Video 4. Buscar Imagen opcion? _1_ query? _Barcelona_ Titulo : Barcelona hotels, apartments, football tickets, city guide of Barcelona Resumen : Travel and city guide for Barcelona, Spain. URL : http://www.barcelona.com/ Titulo : Barcelona - Wikipedia, the free encyclopedia Resumen : Provides an overview of the history and culture of the Spanish city of Barcelona. URL : http://en.wikipedia.org/wiki/barcelona Titulo : The website of Barcelona city Resumen : The official Barcelona website, created by Barcelona City Council, is a... Watch the latest video which brings you closer to the city of Barcelona.... URL : http://www.bcn.es/english/ihome.htm opcion? _2_ query? Tainted love 3
Titulo : Tainted Love Album : Stomp! Shout! Scream - Original Soundtrack Artista : Various Artists Titulo : Tainted Love Album : 30 Greatest Eighties Songs Artista : The Hit Crew Titulo : Tainted Love Album : What s Your Flavour? Artista : Johnny Clueless... Para esto debe utilizar los siguientes servicios: 1. Audio Search Web Services: Song Search. http://developer.yahoo.com/search/audio/v1/songsearch.html Donde la query corresponda a un titulo de alguna canción (parámetro song ). 2. Image Search Web Services http://developer.yahoo.com/search/image/v1/imagesearch.html 3. Video Search Web Services http://developer.yahoo.com/search/video/v1/videosearch.html Para poder parsear un XML. Usando como ejemplo el siguiente XML: <?xml version="1.0" encoding="utf-8"?> <Empleados> <Persona> <Nombre>Maria</Nombre> <Apellido>Mu~noz</Apellido> <Ciudad>Barcelona</Ciudad> </Persona> <Persona> <Nombre>Pablo</Nombre> <Apellido>Flores</Apellido> <Ciudad>Barcelona</Ciudad> </Persona> <Persona> <Nombre>Paula</Nombre> <Apellido>Torres</Apellido> <Ciudad>Barcelona</Ciudad> </Persona> </Empleados> Para poder parsear este fichero, una manera simple es mediante el siguiente trozo de código java: DocumentBuilderFactory docbuilderfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = docbuilderfactory.newdocumentbuilder(); // parsea un Stream que contiene el documento XML Document doc = docbuilder.parse (rstream); doc.getdocumentelement ().normalize (); 4
NodeList listaempleados = doc.getelementsbytagname("persona"); for (int s = 0; s < listaempleados.getlength(); s++) { Node nodo = listaempleados.item(s); if (nodo.getnodetype() == Node.ELEMENT_NODE) { Element elemento = (Element) nodo; NodeList nombre = elemento.getelementsbytagname("nombre"); Element nombreelemento = (Element) nombre.item(0); NodeList textnombre = nombreelemento.getchildnodes(); System.out.println("Nombre : "+((Node) textnombre.item(0)).getnodevalue().trim()); NodeList apellido = elemento.getelementsbytagname("apellido"); Element apellidoelemento = (Element) apellido.item(0); NodeList textapellido = apellidoelemento.getchildnodes(); System.out.println("Apellido : "+ ((Node) textapellido.item(0)).getnodevalue().trim()); NodeList ciudad = elemento.getelementsbytagname("ciudad"); Element ciudadelemento = (Element) ciudad.item(0); NodeList textciudad = ciudadelemento.getchildnodes(); System.out.println("Ciudad : "+ ((Node) textciudad.item(0)).getnodevalue().trim()); La salida seria: Nombre : Maria Apellido : Mu~noz Ciudad : Barcelona Nombre : Pablo Apellido : Flores Ciudad : Barcelona Nombre : Paula Apellido : Torres Ciudad : Barcelona Entrega Debe entregar todos los archivos generados, a través de la sección de Prácticas del Aula Global en un fichero comprimido, con el nombre NIA P7.zip, antes de las 24:00 del miércoles 5 de marzo. Nota Para parsear el XML es necesario incluir: import org.w3c.dom.document; 5
import org.w3c.dom.*; import javax.xml.parsers.documentbuilderfactory; import javax.xml.parsers.documentbuilder; 6