Tema 18. Servicios Web. Los web services son componentes software que permiten a los usuarios usar aplicaciones de negocio que comparten datos con otros programas modulares, vía Internet. Son aplicaciones independientes de la plataforma que pueden ser fácilmente publicadas, localizadas e invocadas mediante protocolos web estándar, como XML, SOAP, UDDI o WSDL. Mediante los web services, las empresas pueden compartir servicios software con sus clientes y sus socios de negocio. Esto ayudará a las compañías a escalar sus negocios, reduciendo el coste en desarrollo y mantenimiento de software, y sacando los productos al mercado con mayor rapidez. La integración de aplicaciones hará posible obtener la información demandada en tiempo real, acelerando el proceso de toma de decisiones. Protocolos que intervienen en un servicio web XML (extensible Markup Language): Un servicio web es una aplicación web creada en XML. Ventajas del XML: o Se trata de un lenguaje abierto. Reconocido por todo el mundo. o Simplicidad de sintaxis. o Independencia del protocolo de transporte. SOAP (Simple Object Access Protocol): Permite que programas que corren en diferentes sistemas operativos se comuniquen. La comunicación entre las diferentes entidades se realiza mediante mensajes que son rutados en un sobre SOAP. WSDL (Web Services Definition Service): Este protocolo se encarga de describir el web service cuando es publicado. Se trata de un dialecto basado en XML sobre el esquema que describe un servicio Web. Un documento WSDL proporciona la información necesaria al cliente para interaccionar con el servicio Web. WSDL es extensible y se pude utilizar para describir, prácticamente, cualquier servicio de red. Los documentos WSDL definen los servicios como colecciones de puntos finales de red o puertos. En WSDL, la definición abstracta de puntos finales y de mensajes se separa de la instalación concreta de red o de los enlaces del formato de datos. Esto permite la reutilización de definiciones abstractas: mensajes, que son descripciones abstractas de los datos que se están intercambiando y tipos de puertos, que son colecciones abstractas de operaciones. Las especificaciones concretas del protocolo y del formato de datos para un tipo de puerto determinado constituyen un enlace reutilizable. Un puerto se define por la asociación de una dirección de red y un enlace reutilizable; una colección de puertos define un servicio. Por esta razón, un documento WSDL utiliza los siguientes elementos en la definición de servicios de red: o Types: contenedor de definiciones del tipo de datos que utiliza algún sistema de tipos (por ejemplo XSD). o Message: definición abstracta y escrita de los datos que se están comunicando. o Operation: descripción abstracta de una acción admitida por el servicio. - 225 -
o o o o Port Type: conjunto abstracto de operaciones admitidas por uno o más puntos finales. Binding: especificación del protocolo y del formato de datos para un tipo de puerto determinado. Port: punto final único que se define como la combinación de un enlace y una dirección de red. Service: colección de puntos finales relacionados UDDI (Universal Description Discovery and Integration): Este protocolo permite la publicación y localización de los servicios. Los directorios UDDI actúan como una guía telefónica de web services. Bloques Constructivos de Servicios Web Descubrimiento UDDI, DISCO Descripción WSDL, Esquema XML, Docs Formato de Mensaje SOAP Codificación XML Transporte HTTP, SMTP y otros Descubrimiento: La aplicación cliente que necesita acceder a la funcionalidad que expone un Servicio Web necesita una forma de resolver la ubicación de servicio remoto. Descripción: Una vez que se ha resuelto el extremo de un servicio Web dado, el cliente necesita suficiente información para interactuar adecuadamente con el mismo. La descripción de un servicio Web implica meta datos estructurados sobre la interfaz que intenta utilizar la aplicación cliente así como documentación escrita sobré el servicio Web incluyendo ejemplo de uso. Formato del mensaje: Para el intercambio de datos, el cliente y el servidor tienen que estar de acuerdo en un mecanismo común de codificación y formato de mensaje. El uso de un mecanismo estándar de codificar los datos asegura que los datos que codifica el cliente los interpretará correctamente el servidor. Codificación: Los datos que se trasmiten entre el cliente y el servidor necesitan codificarse en un cuerpo de mensaje. Dcom utiliza un esquema de codificación binaria para serializar los datos de los parámetros que se intercambian entre el cliente y el servidor. Transporte: Una vez se ha dado formato al mensaje y se han serializado los datos en el cuerpo del mensaje se debe transferir entre el cliente y el servidor utilizando algún protocolo de transporte. DCOM dispone de varios protocolos propietarios como TCP, SPX, NetBEUI y NetBIOS sobre IPX. - 226 -
Crear un Servicio Web 1. Crear un nuevo sitio Web Servicio web ASP.NET, denominado MiPrimerServicio y que guardaremos bajo la carpeta wwwroot del IIS. 2. Se crea un archivo asmx que será el servicio web con un código de prueba. 3. Seleccionamos el fichero del servicio web Ver en el explorador y nos muestra: Si nos diera un error puede ser debido a que hemos instalado el IIS después de tener instalado el Framework 2.0. Para solucionarlo, debemos ir al panel de control Agregar o quitar software seleccionamos el Framework 2.0 y le damos a eliminar nos aparece una pantalla en la cual nos da la opción para reparar le damos a reparar y finalmente reiniciamos. Con esto queda solucionado el problema 4. Hacemos clic sobre HelloWorld y nos muestra: 5. Al invocar el servicio nos aparece la siguiente pantalla: 6. El archivo Service.asmx comienza con la directiva WebService ASP.NET y establece el lenguaje en Visual Basic y el fichero que contiene el code-behind. <%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="Service" %> - 227 -
7. En el fichero service.vb se importa el espacio de nombres System.Web, System.Web.Services y System.Web.Services.Protocols. Seguidamente, se declara la clase HelloWorld. Esta clase se deriva de la clase base WebService; la derivación de la clase base WebService es opcional. Por último, cualquier método que sea accesible como parte del servicio tiene el atributo <WebMethod()> en Visual Basic. 8. Para acceder a la página podemos hacerlo a través de nuestro IIS, http://localhost/ MiPrimerServicio/Service.asmx. La página resultante muestra los métodos públicos para este servicio Web, es decir, aquellos marcados con el atributo WebMethod, así como los protocolos (SOAP o http GET) que se pueden usar para invocar dichos métodos. 9. Al insertar la dirección http://localhost/miprimerservicio/service.asmx?wsdl en el explorador, se devuelve un documento de lenguaje de descripción del servicio web (WSDL). Este documento lo usarán los clientes que tengan acceso al servicio. Consumir servicios web desde Windows Forms 1. Crear un Nuevo proyecto WindowsForms denominado MiClienteWinForm. 2. Añadimos una referencia al servicio web creado previamente. En el explorador de soluciones Agregar Referencia Web o bien especificamos la url donde se encuentra el fichero Service.asmx o bien hacemos clic en Servicios Web del equipo local y de la lista resultante seleccionamos el fichero del servicio web (Service.asmx). 3. Hacemos clic en Agregar referencia. 4. En nuestro formulario incluímos una referencia al espacio de nombres del servicio: Imports MiClienteWinForm.miservicioweb 5. Para hacer la prueba, podríamos poner un botón que al hacer clic muestre el saludo del servicio. El código que tendríamos que incluir sería: 'Crear una instancia al servicio, que en nuestro caso se llama Service Dim saludo As New Service MsgBox(saludo.HelloWorld()) - 228 -
Consumir servicios web desde ASP.NET 1. Crear un Nuevo proyecto web denominado MiClienteWebForm. 2. Añadimos una referencia al servicio web creado previamente. Le cambiamos el nombre de la carpeta default por MiServicio. 3. En el código behind del webform incluímos una referencia al espacio de nombres del servicio: Imports MiServicio. 4. Para hacer la prueba, podríamos poner un botón que al hacer clic muestre el saludo del servicio dentro de un textobox. El código a incluir en el clic del botón sería: Dim saludo As New Service Me.txtSaludo.Text = saludo.helloworld Consumir servicios web teniendo sólo el WSDL En la siguiente URL se explica el proceso completo de crear clientes de servicios web: http://msdn2.microsoft.com/es-es/library/w3h45ebk(vs.80).aspx. En muchas ocasiones, disponemos del fichero WSDL que define un servicio web y nos interesaría poder consumirlo. Para ello el SDK del Framework de Microsoft nos proporciona una herramienta, wsdl.exe, que es capaz de generarlos (http://msdn2.microsoft.com/es-es/library/d2s8y7bs(vs.80).aspx). Esta herramienta se encuentra en el directorio C:\Archivos de programa\microsoft Visual Studio 8\SDK\v2.0\Bin. Antes de usarlo, debemos hacer que en las variables de entorno de nuestro ordenador se añadan las del SDK para poder ejecutarlo desde cualquier parte del equipo ya que se hace a nivel de consola. Esto se consigue ejecutando el fichero bat sdkvar.bat que se encuentra en este mismo directorio. Vamos a crear el proxy del servicio web que hemos elaborado previamente: 1. Nos situamos en el directorio c:\inetpub\wwwroot\ y creamos una nueva carpeta MiPrimerCliente. 2. Abrimos una consola de msdos y nos situamos en este directorio. 3. Si tenemos el wsdl del servicio web que queremos consumir en el directorio, la forma de generar el cliente sería: wsdl esquema.wsdl /language:vb. 4. Si tenemos la url del servicio web la sintaxis sería: wsdl http://localhost/miprimerservicio/service.asmx?wsdl /language:vb. 5. Cualquiera de estas dos acciones, nos genera un fichero vb que contiene una clase Proxy del servicio web que queremos consumir. Si nos fijamos en la clase Proxy que hemos generado contiene tres métodos para llamar al servicio web: HelloWorld, BeginHelloWorld y EndHelloWorld. El método HelloWorld de la clase de proxy se utiliza para comunicarse de forma sincrónica con el método de servicio Web, mientras que los métodos BeginHelloWorld y EndHelloWorld se utilizan para comunicarse de forma asincrónica con un método de servicio Web. Una vez generado el Proxy ya sólo nos queda crear una aplicación cliente que llame a los métodos de la clase Proxy. Crearemos un cliente (Windows form o web form) que incluya una referencia a la clase Proxy generada. Se creará una instancia a la clase Proxy y se llamará al método de la clase Proxy correspondiente al método del servicio web con el queremos comunicarnos. - 229 -
Crear un servicio web que tenga acceso a datos En la siguiente URL se explica cómo crear un servicio web que ataca la base de datos Northwind y devuelve un DataSet que puede ser usado por cualquier cliente: http://www.elguille.info/net/aspnet/ejemplosmut2005.aspx Probar el ejemplo que se plantea: 1º crear el servicio web que ataque la base de datos y luego crear dos aplicaciones una webform y otra Windows form que ataquen el servicio, tal y como se explica en el ejemplo. Ejemplos de el Guille sobre servicios web En la siguiente URL se da acceso a varios servicios web para poder hacer alguna prueba. También se explica cómo usarlos: http://www.elguille.info/net/webservices/indice.asp Práctica Crear y Consumir un ServicioWeb - Calculadora 1. Crear un nuevo proyecto de servicio web denominado Calculadora. 2. Dentro de este nuevo servicio, declararemos 4 funciones, que reciben como parámetros dos números a y b: suma, resta, división y multiplicación. 3. Comprobaremos que los métodos creados funcionan, para ello nos situaremos en el fichero del servicio Ver en el Explorador. 4. Creremos un nuevo proyecto web denominado ClienteCalculadora. 5. Tendremos que incluir la referencia web a nuestro servicioweb y continuación hacer un import en el código de la página asp. En este punto, podemos hacerlo o bien en el código behind o en el código in-line. 6. Se ha de crear un formulario como el que se muestra a continuación: 7. Los botones deberán llamar a la función del servicio web que corresponda y mostrar el resultado en la parte inferior. Se ha de comprobar que los datos introducidos sean numéricos para ello podemos usar las etiquetas vistas para validación. - 230 -
Práctica Consumir un ServicioWeb externo 1. En la siguiente url disponemos del WSDL de un servicio Web que nos permite hacer búsquedas en Google: http://api.google.com/googlesearch.wsdl. 2. Creamos el Proxy vb para el servicio web. Así podremos abrirlo, y ver que propiedades y métodos tiene, cosa que nos puede ayudar a ver qué podemos usar y cuando (wsdl.exe). 3. Vamos a necesitar una clave para poder usar el servicio. A partir del 5 de diciembre de 2006, Google ya no da más códigos, así que todos tendremos que usar el siguiente: Cne9tftQFHIcdf76xWaHIO+46UKNkqWj. Este código será el primer campo que se le pase al método dogooglesearch. 4. Vamos a crear una aplicación de Windows que consuma este servicio, denominada ConsumirBusquedaGoogle. La pantalla principal sería: 5. Lo primero será incluir la referencia web del WSDL en nuestro proyecto. A continuación incluir la referencia a él en el código de nuestro proyecto. 6. El botón buscar, debe: - Crear un objeto de búsqueda Google (GoogleSearchService). Pe: busqueda - Crear un objeto donde almacenar los resultados de la búsqueda Google (GoogleSearchResult). Pe: resultado - Realizar la búsqueda usando el método dogooglesearch sobre el objeto busqueda y almacenarlo en el objeto resultado. - El número estimado de resultados es una propiedad (estimatedtotalresultscount) del objeto resultado. 7. Ahora, crearemos un nuevo proyecto Web denominado ConsumirBusquedaGoogle_asp cuya página principal sería: Y la de resultados: - 231 -
8. Tendremos que incluir la referencia al WSDL del servicio. Para realizar la búsqueda ser hará de la misma forma. En esta ocasión limitaremos el número de resultados a 15. 9. Mostraremos los enlaces de las páginas encontradas. Para ello haremos que los resultados se almacenen en un repeater de asp. Por ejemplo, si mi repeater se llama resultadosencontrados el código que tendríamos que añadir a continuación de haber hecho la búsqueda sería el siguiente: resultadosencontrados.datasource = resultado.resultelements resultadosencontrados.databind() 10. Luego, en el código asp tendremos que utilizar el <asp:repeater> de la siguiente forma: <asp:repeater id="resultadosencontrados" runat="server" visible="true"> <ItemTemplate> <br /> <a href="<%# DataBinder.Eval(Container.DataItem, "URL") %>"><%# DataBinder.Eval(Container.DataItem, "Title")%> </a> <br /><%# DataBinder.Eval(Container.DataItem, "snippet") %> %> <br /><%# DataBinder.Eval(Container.DataItem, "URL") %> </ItemTemplate> </asp:repeater> 11. Lo que hacemos en este código es primero poner en el atributo ref. del enlace la URL del resultado obtenido, a continuación muestra el título y el comentario y por último se repite la url pero esta vez se muestra. - 232 -