You are on page 1of 16

Instituto Politcnico Nacional

Materia: Tema:

Web Application Development. Servicios Web: XML, SOAP, WSDL y UDDI.

Objetivos.

i. Introduccin a los servicios Web. ii. Describir los elementos de un servicio Web. iii. Desarrollar un ejemplo utilizando un servicio Web con NuSOAP y dos archivos PHP. En el apndice pueden encontrar el cdigo de los dos archivos que consumen el web service para poder verlos en lnea, o bajarlos comprimidos (ZIP), el archivo comprimido tambin provee de otros archivos de soporte.

Introduccin

Un Servicio Web (o Web Service) es un sistema software diseado para soportar la interoperabilidad mquinamquina a travs de una red. Este servicio posee una interfaz descrita en un formato que puede ser procesado por una mquina (especficamente WSDL, que se ver ms adelante). Otros sistemas interactan con el Web service utilizando mensajes SOAP los cuales se encuentran establecidos previamente. Un Web Service es una comunicacin por medio de mensajes SOAP, mensajes especiales, entre diferentes equipos a travs de una red.

El significado de XML, SOAP, WSDL, UDDI.


Un Servicio Web se compone de los elementos fundamentales XML, SOAP, WSDL y UDDI.

1. XML - eXtensible Markup Language


Es un subconjunto simplificado del SGML el cual fue diseado principalmente para documentos Web. Permite que los diseadores crear sus propias etiquetas o tags (por ejemplo, <libro>), habilitando la definicin, transmisin, validacin y la interpretacin de datos entre aplicaciones y entre organizaciones. Un punto que es importante aclarar, es que el HTML y el XML tienen funciones diferentes. El HTML tiene por objeto mostrar informacin, mientras que el XML se ocupa de la informacin como tal (el contenido). Este concepto es importante tenerlo en cuenta, ya que XML no es sucesor de HTML. Ejemplo de un documento XML sobre informacin de autos: <?xml version="1.0" encoding="UTF-8"?> <vehiculos> <coche> <marca>Toyota</marca> <modelo>Corolla</modelo> <fechaCompra>2002</fechaCompra> </coche> <coche> <marca>Honda</marca> <modelo>Civic</modelo> <fechaCompra>2003</fechaCompra> </coche> </vehiculos>
M. en C. Alejandro Cifuentes A. Pgina 1

Instituto Politcnico Nacional

Las secciones del documento son las siguientes: Todo documento XML debe comenzar indicando que es un documento XML, la versin del mismo y su codificacin. Es por eso que se utiliza el tag <?xml .... ?>, de la siguiente forma: <?xml version="1.0" encoding="UTF-8"?> Luego se indica un tag raz (<vehiculos>) el cual contendr a los dems elementos. Es como en HTML el tag <HTML> .. </HTML>, que dentro de l se encuentran los dems tags. Se lo conoce generalmente como root del documento: <vehiculos> Luego definimos un tag <coche> el cual contendr un coche en particular (en este caso solo se incorporan tres caractersticas de un coche: marca, modelo, y fecha de compra). <marca>Toyota</marca> <modelo>Corolla</modelo> <fechaCompra>2002</fechaCompra> Se definen tres tags (marca, modelo, y fechaCompra), los cuales contienen los datos para un coche en particular. <vehiculos> . <coche> . . <marca>..</marca> . . <modelo>..</modelo> . . <fechaCompra>..</fechaCompra> . </coche> </vehiculos> En el documento podemos apreciar que todos los tags que son abiertos como <marca> deben ser cerrados con </marca>. Esto es una exigencia del XML. Se pueden anidar tags <coche><marca></marca>..</coche>. Es decir, marca est dentro del tag coche. El XML provee muchas otras posibilidades, como puede ser que las etiquetas tengan atributos (<coche color="rojo">..</coche>), pero la idea es simplemente describir los conceptos bsicos para conocer de que se trata el mundo de los Web Services.

2. SOAP - Simple Object Access Protocol


Es un protocolo de comunicacin, el cual permite la comunicacin entre aplicaciones a travs de mensajes por medio de Internet. Es independiente de la plataforma y del lenguaje. Est basado en XML y es la base principal de los Web Services. Los mensajes SOAP son un documento XML propiamente dicho. La estructura bsica del protocolo y la correspondiente explicacin: <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" Soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> <soap:Header> ...
M. en C. Alejandro Cifuentes A. Pgina 2

Instituto Politcnico Nacional

</soap:Header> ... <soap:Fault> ... </soap:Fault> </soap:Body> </soap:Envelope>

<soap:Body>

Se observa que esta lnea SOAP es un documento XML, y como tal debe comenzar con el tag <?xml.?> y la versin correspondiente. <?xml version="1.0"?> Con <soap:Envelope se indica que comienza el envelope (sobre) del mensaje: xmlns:soap = "http://www.w3.org/2001/12/soap-envelope" Un mensaje SOAP debe contener siempre un elemento envelope asociado con el namespace (espacio de nombres), en este caso http://www.w3.org/2001/12/soap-envelope En Soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> se indica donde se encuentran definidos los tipos de datos utilizados en el documento. En <soap:Header> se indica el comienzo del Header (encabezado). En esta seccin se incluye informacin especfica del mensaje, como es la autenticacin. La lnea </soap:Header> indica la finalizacin del Header (encabezado). Como todo documento XML los tags que son abiertos deben ser cerrados. En <soap:Body> comienza el cuerpo del mensaje; en esta seccin se incorpora toda la informacin necesaria para el nodo final. Por ejemplo, los parmetros para la ejecucin, o la respuesta a una peticin. Cualquier tipo de fallo que se produzca ser notificado en la seccin<soap:Fault>, la cual esta contenida dentro del cuerpo del mensaje. Cierre de la seccin Fault: </soap:Fault> Indica el final del cuerpo del mensaje: </soap:Body> Fin del mensaje SOAP: </soap:Envelope>

3. WSDL - Web Services Description Language


M. en C. Alejandro Cifuentes A. Pgina 3

Instituto Politcnico Nacional

Es un protocolo basado en XML que describe los accesos al Web Service. Se podra decir que es el manual de operacin del web service, porque indica cuales son las interfaces que provee el Servicio web y los tipos de datos necesarios para la utilizacin del mismo. Un ejemplo de un documento WSDL: <?xml version="1.0"> <definitions> <types> ... </types> <message> ... </message> <portType> ... </portType> <binding> ... </binding> </definitions> <?xml version="1.0"> Este es otro documento XML, es por esto que debe comenzar con el tag <?xml .. ?>: Comienzo del documento, este tag agrupa a todos los dems: <definitions> Se definen los tipos de datos utilizados en el Web Service: <types> Fin de la definicin de tipos: </types> Se definen los mtodos y parmetros para realizar la operacin. Cada message puede consistir en una o ms partes (parmetros): <message> Fin de la definicin de los parmetros: </message> Esta seccin es la ms importante, ya que se definen las operaciones que pueden ser realizadas, y los mensajes que involucran: <portType> Fin de la definicin de las operaciones y mensajes: </portType>
M. en C. Alejandro Cifuentes A. Pgina 4

Instituto Politcnico Nacional

Se definen el formato del mensaje y detalles del protocolo para cada portType: <binding> Fin de la definicin del formato del mensaje y detalles del protocolo para cada PortType: </binding> Fin del documento WSDL: </definitions>

4. UDDI - Universal Discovery Description and Integration


Es un modelo de directorios para Web Services. Es una especificacin para mantener directorios estandarizados de informacin acerca de los Web Services, sus capacidades, ubicacin y requerimientos en un formato reconocido universalmente. UDDI utiliza WSDL para describir las interfaces de los Web Services. Es un lugar en el cual se buscan cuales son los servicios web disponibles, una especie de directorio en el cual se encuentran los Web Services publicados y publicar los Web Services que se desarrollen. http://soapclient.com/uddisearch.html http://uddi.org/find.html

Inicio de los Servicios Web.


Los Servicios Web surgieron ante una necesidad de estandarizar la comunicacin entre distintas plataformas (PC, Mainframe, Mac, etc.) y lenguajes de programacin (PHP, C#, Java, etc.). Anteriormente se haban realizado intentos de crear estndares, pero fracasaron o no tuvieron el suficiente xito, algunos de ellos son DCOM y CORBA, por ser dependientes de la implantacin del vendedor DCOM de Microsoft, y CORBA de ORB (a pesar que CORBA de mltiples vendedores pueden operar entre s, hay ciertas limitaciones para aplicaciones de niveles ms altos en los cuales se necesite seguridad o administracin de transacciones). Otro gran problema es que se haca uso de RPC (Remote Procedure Call) para realizar la comunicacin entre diferentes nodos, esto adems de presentar ciertos problemas de seguridad, tiene la desventaja de que su implantacin en un ambiente como es Internet, es casi imposible (muchos firewalls bloquean este tipo de mensajes, lo que hace prcticamente imposible a dos computadoras conectadas por Internet comunicarse). Los Web Services surgieron para finalmente poder lograr la tan esperada comunicacin entre diferentes plataformas. En la actualidad muchos sistemas legacy estn pasando a ser web services. Es por esto que en 1999 se comenz a plantear un nuevo estndar, el cual terminara utilizando XML, SOAP, WSDL y UDDI.

Los Web services no se utilizan solamente con HTTP.


A pesar de que muchos limitan el uso de los Web services al protocolo HTTP, los Web Services no fueron pensados para un protocolo en particular, es decir, nada impide utilizar SOAP sobre algn otro protocolo de Internet (SMTP, FTP, etc.). Se utiliza principalmente HTTP por ser un protocolo ampliamente difundido y que se encuentra menos restringido por firewalls (generalmente se bloquean puertos como el FTP, pero el HTTP es muy probable que no est bloqueado).

NuSOAP
Es un kit de herramientas para desarrollar Web Services bajo el lenguaje PHP. Est compuesto por una serie de clases que harn mucho ms fcil el desarrollo de Web Services. Provee soporte para el desarrollo de clientes
M. en C. Alejandro Cifuentes A. Pgina 5

Instituto Politcnico Nacional

(aquellos que consumen los Web Services) y de servidores (aquellos que los proveen). NuSOAP est basado en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1

NuSOAP no es el nico soporte para Web Services en PHP


No es el nico, existen otros, pero es uno de los que estn en una fase de desarrollo mucho ms avanzada. PHP, a partir de su versin 5, comienza a dar soporte para SOAP, pero aun est en fase experimental. NuSOAP: Est en una fase madura de desarrollo. No necesita mdulos adicionales. Es muy fcil su instalacin y uso

Instalacin y Uso.

1. Instalacin de NuSOAP.
Abrir a la pagina en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y descargar el archivo comprimido zip. Se descomprime en un directorio del servidor web y ya se puede hacer uso de NuSOAP.

2. Uso de NuSOAP.
Se hace uso de la pgina de XMethods (http://xmethods.com/), para los datos del clima de todo el mundo. Este Web Service tiene 9 mtodos que podemos utilizar; todos ellos se encuentran definidos en el archivo WSDL que se encuentra en http://live.capescience.com/wsdl/GlobalWeather.wsdl. Los mtodos son: getStation(), isValidCode(), listCountries(), searchByCode(), searchByCountry(), searchByLocation(), searchByName(), searchByRegion(), getWeatherReport(). Para este ejemplo solo se utilizan los mtodos searchByCountry() y getWeatherReport(). En el ejemplo existen dos archivos: seleccionarLocalidad.php: el cual permite seleccionar una localidad determinada de un pas (el pas est dado por el valor de la variable $sPais). Este archivo PHP utiliza el mtodo del Web Service searchByCountry() mostrarPronostico.php: el cual muestra el pronstico para la localidad seleccionada. Este archivo PHP utiliza el mtodo del Web Service getWeatherReport(). Si se desea ver un listado de los servicios publicados se puede visitar la pgina: CapeScience O en este otro link: MindReef Ambos permiten probar los mtodos de los Web Services en lnea, sin necesidad de un cliente SOAP, pero esto no es de utilidad, principalmente para ver cmo funciona cada uno de los mtodos.
M. en C. Alejandro Cifuentes A. Pgina 6

Instituto Politcnico Nacional

3. Mensajes del Web Service


Toda la informacin del Web Service se encuentra definida dentro del documento WSDL; para este Web Service se encuentra definida en CapeScience Este documento en particular tiene 425 lneas, por lo que la lectura del mismo es bastante tediosa. Las lneas ms importantes son las que hacen referencia a los mtodos searchByCountry() y getWeatherReport() ). Ahora, buscar las lneas donde se encuentran las definiciones de los mtodos dentro del archivo: Mensajes de searchByCountry: entre las lineas 277 a 282 podemos apreciar que se encuentra lo siguiente: 277. <message name="searchByCountryResponse"> 278. <part name="return" type="xsd1:ArrayOfStation"/> 279. </message> 280. <message name="searchByCountry"> 281. <part name="country" type="xsd:string"/> 282. </message> SearchByCountry: comencemos por la lnea 280 y dejaremos para despus las lneas 277 a 279. En la lnea 280 se indica que existe un mtodo llamado searchByCountry, que es el mtodo que se busca: 280. <message name="searchByCountry"> En la lnea 281 se define un parmetro para ese mtodo se llama country (pas) y es del tipo string. 281. <part name="country" type="xsd:string"/> Fin del mtodo seachByCountry 282. </message> Ejemplo de un mensaje real con el parmetro country asignado con "mexico": <nu:searchByCountry> <country xsi:type="xsd:string">mexico</country> </nu:searchByCountry> SearchByCountryResponse: Ahora se analiza el mtodo searchByCountryResponse, como su nombre lo indica es la respuesta al mtodo searchByCountry. Es decir, cuando se invoca a searchByCountry, el servidor responder con un mensaje con el formato de searchByCountryResponse. Las respuestas tienen anexado al final Response al nombre del mtodo. Esta lnea nos indica que es una respuesta al mtodo searchByCountry. 277. <message name="searchByCountryResponse"> El mtodo nos devuelve una variable return la cual es del tipo ArrayOfSation. Como se mencion anteriormente, los documentos WSDL pueden definir sus propios tipos de datos, ArrayOfStation es un tipo de datos definido en este WSDL. 278. <part name="return" type="xsd1:ArrayOfStation"/>
M. en C. Alejandro Cifuentes A. Pgina 7

Instituto Politcnico Nacional

Fin del mtodo searchByCountryResponse. 279. </message> Como se mencion anteriormente, se hace referencia a un ArrayOfStation, para ver de qu se trata esto se busca este tipo de datos dentro del archivo WSDL. En las lneas comprendidas entre 148 y 157, se puede ver cmo se define este tipo de datos. 148. <xsd:complexType name="ArrayOfStation"> 149. <xsd:complexContent> 150. <xsd:restriction base="SOAP-ENC:Array"> 151. <xsd:sequence> 152. <xsd:element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd1:Station"/> 153. </xsd:sequence> 154. <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd1:Station[]"/> 155 </xsd:restriction> 156. </xsd:complexContent> 157. </xsd:complexType> En la lnea 148 se puede ver que se define un tipo de datos complejo (complexType) con el nombre de "ArrayOfStation", el tipo de datos que se busca. 148. <xsd:complexType name="ArrayOfStation"> Indicamos que es un elemento complejo (array). 149. <xsd:complexContent> 150. <xsd:restriction base="SOAP-ENC:Array"> 151. <xsd:sequence> La lnea 152 es la que ms interesa, ya que se indica precisamente como est compuesto el arreglo array. Indica que tiene un mnimo de ocurrencias de 0 (MinOccurs= 0), es decir, que puede no tener elementos. Un mximo de ocurrencias no limitado (maxOccurs=unbounded), es decir que se pueden tener todos los elementos que se deseen. Y al finalizar se indica el tipo de datos del array, que es Station. Sin embargo, ahora se debe buscar qu tipo de datos es Station. Se observa que un dato se define a partir de otro, hasta llegar a los tipos de datos bsicos. 152. <xsd:element maxOccurs="unbounded" minOccurs="0" name="item" type="xsd1:Station"/> Se cierran los tags anteriormente abiertos. 153. </xsd:sequence> Terminamos de definir el array. 154. <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="xsd1:Station[]"/>

M. en C. Alejandro Cifuentes A.

Pgina 8

Instituto Politcnico Nacional

Se cierran los dems tags que fueron abiertos. 155. </xsd:restriction> 156. </xsd:complexContent> 157. </xsd:complexType> Queda pendiente definir el tipo de datos "Station", nuevamente al buscar en el cdigo se encuentra entre las lneas 134 a 147 la definicin de este tipo de datos. 134. <xsd:complexType name="Station"> 135. <xsd:sequence> 136. <xsd:element maxOccurs="1" minOccurs="1" name="icao" nillable="true" type="xsd:string"/> 137. <xsd:element maxOccurs="1" minOccurs="1" name="wmo" nillable="true" type="xsd:string"/> 138. <xsd:element maxOccurs="1" minOccurs="1" name="iata" nillable="true" type="xsd:string"/> 139. <xsd:element maxOccurs="1" minOccurs="1" name="elevation" type="xsd:double"/> 140. <xsd:element maxOccurs="1" minOccurs="1" name="latitude" type="xsd:double"/> 141. <xsd:element maxOccurs="1" minOccurs="1" name="longitude" type="xsd:double"/> 142. <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string"/> 143. <xsd:element maxOccurs="1" minOccurs="1" name="region" nillable="true" type="xsd:string"/> 144. <xsd:element maxOccurs="1" minOccurs="1" name="country" nillable="true" type="xsd:string"/> 145. <xsd:element maxOccurs="1" minOccurs="1" name="string" nillable="true" type="xsd:string"/> 146. </xsd:sequence> 147. </xsd:complexType> Se define que comienza el tipo de datos complejo Station. 134. <xsd:complexType name="Station"> Se indica que se comienza con la definicin del tipo secuencia (es decir que todos los elementos que se definen dentro estn incluidos en el tipo de datos Station). Existen otro tipo que no es secuencia (sequence), y se llama choice (eleccin), en el cual se selecciona entre uno de los elementos dentro definidos (aquellos comprendidos entre <xsd:choice> y </xsd:choice>). 135. <xsd:sequence> Se definen 3 elementos los cuales son del tipo string, dichos elementos son: icao, wmo, e iata. 136. <xsd:element maxOccurs="1" minOccurs="1" name="icao" nillable="true" type="xsd:string"/> 137. <xsd:element maxOccurs="1" minOccurs="1" name="wmo" nillable="true" type="xsd:string"/>
M. en C. Alejandro Cifuentes A. Pgina 9

Instituto Politcnico Nacional

138. <xsd:element maxOccurs="1" minOccurs="1" name="iata" nillable="true" type="xsd:string"/> Se definen otros 3 elementos, en este caso longitude. 139. <xsd:element maxOccurs="1" type="xsd:double"/> 140. <xsd:element maxOccurs="1" type="xsd:double"/> 141. <xsd:element maxOccurs="1" type="xsd:double"/> son del tipo double. Estos son: elevation, latitude, y minOccurs="1" name="elevation" minOccurs="1" name="latitude" minOccurs="1" name="longitude"

Se definen los ltimos 4 elementos del tipo string. Los elementos aqu definidos son: name, region, country, y string. 142. <xsd:element maxOccurs="1" minOccurs="1" name="name" nillable="true" type="xsd:string"/> 143. <xsd:element maxOccurs="1" minOccurs="1" name="region" nillable="true" type="xsd:string"/> 144. <xsd:element maxOccurs="1" minOccurs="1" name="country" nillable="true" type="xsd:string"/> 145. <xsd:element maxOccurs="1" minOccurs="1" name="string" nillable="true" type="xsd:string"/> Cerrar los tags abiertos anteriormente. 146. </xsd:sequence> 147. </xsd:complexType> Ahora, un ejemplo de respuesta: <return xsi:type="cc1:ArrayOfStation" SOAP-ENC:arrayType="cc1:Station[86]"> <item xsi:type="cc1:Station"> <icao xsi:type="xsd:string">SARS</icao> <wmo xsi:type="xsd:string">87149</wmo> <iata xsi:nil="true"/> <elevation xsi:type="xsd:double">91.0</elevation> <latitude xsi:type="xsd:double">-26.817</latitude> <longitude xsi:type="xsd:double">-60.45</longitude> <name xsi:type="xsd:string">Presidente Felipe Caldern Hinojosa Los Pinos</name> <region xsi:nil="true"/> <country xsi:type="xsd:string"> Mxico </country> <string xsi:type="xsd:string">SARS Presidente Felipe Caldern Hinojosa Los Pinos , Mxico @ -26.817&apos;S -60.45&apos;W 91m</string> </item> <item xsi:type="cc1:Station"></return>

M. en C. Alejandro Cifuentes A.

Pgina 10

Instituto Politcnico Nacional

Para aclarar el tipo de estructura de ArrayOfStation se usa una analoga con otros lenguajes de programacin: // Delphi // Station = record icao : String; wmo : String; iata : String; elevation : String; latitude : String; longitude : String; name : String; region : String; country : String; string_ : String; end; ArrayOfSation : array of Station; // C# // struct Station { String icao; String wmo; String iata; String elevation; String latitude; String longitude; String name; String region; String country; String string_; } Station[] ArrayOfStation;
4.

La Programacin.

No es fcil seguir todo lo que est definido dentro de un documento WSDL, pero los mismos sitios donde se encuentran alojados los Web Services proveen de la informacin necesaria, sin necesidad de recurrir a ver los archivos WSDL. Tambin existen aplicaciones como Altova XMLSPY que proveen de la informacin de manera grfica.

Programacin
Se divide la aplicacin de prueba del Web Service en dos archivos, uno que muestra todas las localidades donde existen pronsticos (seleccionarLocalidad.php) y otro que muestra el pronstico para la localidad seleccionada (mostrarPronostico.php) Consumo de un web service (searchByCountry): En el cdigo se han eliminado las comprobaciones de errores para facilitar la lectura de los pasos. Los pasos para consumir un servicio web desde PHP son:
M. en C. Alejandro Cifuentes A. Pgina 11

Instituto Politcnico Nacional

Se debe incluir la librera NuSOAP. En este ejemplo se asume que el directorio donde se encuentra el archivo nusoap.php esta ubicado en el subdirectorio lib (a partir de donde esta nuestro script). require_once("lib/nusoap.php"); Se debe instanciar la clase soapclient, ya que en esta ocasin se utiliza solamente el cliente que provee NuSOAP. Los parmetros enviados son la ubicacin del documento WSDL y como segundo parmetro true (este ltimo parmetro indica que el primer documento es un WSDL). $oSoapClient = new soapclient('http://live.capescience.com/wsdl/GlobalWeather.wsdl', true); Definimos un array con el pas para el cual se quieren obtener las localidades que tienen pronsticos disponibles. Volviendo al documento WSDL podemos ver que la variable que debemos enviar es "country" y que es del tipo string: $aParametros = array("country" => "mexico"); Se invoca al mtodo call del objeto soapclient. Al mismo le pasamos como parmetro el nombre del mtodo que queremos ejecutar en el web service (searchByCountry) y los parmetros ($aParametros). 280. <message name="searchByCountry"> 281. <part name="country" type="xsd:string"/> 282. </message> En la variable $aRespuesta se tiene un array con la respuesta del Web Service. Este array tiene el formato descrito en "ArrayOfStation" (el cual fue visto anteriormente). Es decir, se puede acceder a las variables descriptas en ArrayOfStation de la siguiente manera: $aRespuesta["wmo"], $aRespuesta["elevation"], $aRespuesta["name"], etc. $aRespuesta = $oSoapClient->call("searchByCountry", $aParametros); Ahora que ya se conoce como sera el procedimiento para consumir un Web Service, se analiza con ms profundidad los mtodos de soapclient que se utilizan. Al crear una instancia de soapclient, existen varios parmetros que se pueden enviar para su creacin: $oSoapClient = new soapclient( <url donde se encuentra el web service o WSDL>, [<booleana indicando si el primer parmetro es un WSDL>], [<entero con el Portame>], [<cadena proxyHost>], [<cadena proxyPort>], [<cadena nombre de usuario>], [<cadena password>], [<entero con el timeout de la conexin>], [<entero con el timeout de la respuesta>]); Solo el primer parmetro es necesario (la ubicacin del Web Service o del documento WSDL del Web Service), todos los dems son opcionales.
M. en C. Alejandro Cifuentes A. Pgina 12

Instituto Politcnico Nacional

Al ejecutar el Web Service, existen varios parmetros que se pueden enviar al mtodo: call( <mtodo que queremos ejecutar en el servidor>, [<un array asociativo con los parmetros que se deben enviar (si existen)>], [<cadena con el espacio de nombres (namespace)>], [<cadena con el valor de la accin SOAP>], [<booleana indicando si esta presente los valores de SOAPVAL en los headers>], [<booleana la cual ya no se utiliza>], [<cadena con el style a usar cuando se realiza la serializacin de los parametros>], [<cadena que puede ser "encoded" o "literal" utilizada para serializacin de los parametros>]); Se observa que existen muchos ms parmetros de los que se haban utilizado, pero su uso exige un conocimiento ms profundo sobre los Web Services.

5. Uso de los Web Services.


Existen muchas formas en que se podra usar este Web Service. Como ejercicio se deja que el visitante seleccione su pas y localidad, y que nuestro sitio le retorne cual es el pronstico actual (solo se debera incorporar un paso anterior al que se ofrece en el cdigo, que es el de seleccin del pas). Otro uso que se dar es el de mostrar cual es el clima actual para una localidad determinada. Si se decide implantar la segunda opcin se debe tener especial cuidado cmo se hace, ya que si por cada peticin que haga el usuario se debe conectarse con el servidor que ofrece el web service, esto provocara una gran demora para el usuario, y una sobrecarga innecesaria del servidor. Para solucionar esto se puede guardar en un archivo de texto o en una base de datos, el clima actual, para leerlo desde all. Este archivo, o base de datos, se actualizara cada un tiempo prudencial (por ejemplo, una hora o ms).
6.

Otros Web Services.

Actualmente existen gran cantidad de Web Services, gratuitos y otros no, en el sitio de XMethods se puede encontrar gran cantidad de ellos. Google ofrece un web service para realizar bsquedas (se debe registrar en http://www.google.com/apis/) Los Web Services brindan gran funcionalidad y posibilidad de realizar cambios y mejorar las aplicaciones. Un mismo web service puede ser consumido tanto por aplicaciones que se ejecutan en un servidor y entregan cdigo HTML al cliente, como por aplicaciones que corren directamente en la maquina del cliente. Las posibilidades son infinitas.

Cdigo seleccionarCiudad.php
1. <?php 2. /** 3. * Cdigo para consumir un servicio web (Web Service) por medio de NuSoap.

M. en C. Alejandro Cifuentes A.

Pgina 13

Instituto Politcnico Nacional 4. * La distribucin del cdigo es totalmente gratuita y no tiene ningn tipo de
restriccin. 5. * Se agradece que mantengan la fuente del mismo. 6. */ 7. 8. $sPais = ""; // Nombre del pas que queremos el listado de localidades 9. // Inclusin de la libreria nusoap (la que contendr toda la conexin con el servidor // 10. require_once('lib/nusoap.php'); 11. 12. $oSoapClient = new soapclient('http://live.capescience.com/wsdl/GlobalWeather.wsdl', true); 13. 14. if ($sError = $oSoapClient->getError()) { 15. echo "No se pudo realizar la operacin [" . $sError . "]"; 16. die(); 17. } 18. $aParametros = array("country" => $sPais); 19. $respuesta = $oSoapClient->call("searchByCountry", $aParametros); 20. 21. // Existe alguna falla en el servicio? 22. if ($oSoapClient->fault) { // Si 23. echo 'No se pudo completar la operaci&oacute;n'; 24. die(); 25. } else { // No 26. $sError = $oSoapClient->getError(); 27. // Hay algun error ? 28. if ($sError) { // Si 29. echo 'Error:' . $sError; 30. die(); 31. } 32. } 33. ?> 34. <html> 35. <body> 36. <form action="mostrarPronostico.php" method="post" name="frmLocalidades" id="frmLocalidades"> 37. <table width="400" border="0" cellspacing="0" cellpadding="0"> 38. <tr> 39. <td colspan="2"><div align="center">Seleccione una localidad</div></td> 40. </tr> 41. <tr> 42. <td width="61">&nbsp;</td> 43. <td width="339">&nbsp;</td> 44. </tr> 45. <tr> 46. <td>Localidad:</td> 47. <td><select name="codLocalidad" id="codLocalidad"> 48. 49. <?php 50. // Recorremos el array (wmo es la clave que necesitamos para el prximo script) 51. foreach ($respuesta as $iClave => $aElemento) 52. echo "<option value='".$aElemento["wmo"]."'>".$aElemento["name"]."</option>"; 53. ?>

M. en C. Alejandro Cifuentes A.

Pgina 14

Instituto Politcnico Nacional


54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. </select></td> </tr> <tr> <td>&nbsp;</td> <td>&nbsp;</td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" name="Submit" value="Quiero ver el pronostico"></td> </tr> </table> </form> </body> </html>

Cdigo mostrarPronostico.php
1. <?php 2. /** 3. * Cdigo para consumir un servicio web (Web Service) por medio de NuSoap 4. * La distribucin del cdigo es totalmente gratuita y no tiene ningn tipo de restriccin. 5. * Se agradece que mantengan la fuente del mismo. 6. */ 7. // Le indicamos a PHP que no muestre los Notices (por si el servicio no retorna datos) 8. // (esto se puede evitar preguntando si hay datos antes de mostrarlos) 9. error_reporting(1); 10. 11. // Inclusin de la libreria nusoap (la que contendr toda la conexin con el servidor // 12. require_once('lib/nusoap.php'); 13. $oSoapClient = new soapclient('http://live.capescience.com/wsdl/GlobalWeather.wsdl', true); 14. if ($sError = $oSoapClient->getError()) { 15. echo "No se pudo realizar la operacin [" . $sError . "]"; 16. die(); 17. } 18. // Viene de un POST => Seleccion una ciudad 19. if ($_SERVER["REQUEST_METHOD"] == "POST") { 20. $aParametros = array("code" => $_POST["codLocalidad"]); 21. $aRespuesta = $oSoapClient->call("getWeatherReport", $aParametros); 22. } 23. // Existe alguna falla en el servicio? 24. if ($oSoapClient->fault) { // Si 25. echo 'No se pudo completar la operaci&oacute;n'; 26. die(); 27. } else { // No 28. $sError = $oSoapClient->getError(); 29. // Hay algun error ? 30. if ($sError) { // Si 31. echo 'Error:' . $sError; 32. }

M. en C. Alejandro Cifuentes A.

Pgina 15

Instituto Politcnico Nacional


33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. } ?> <html> <body> <table width="367" border="0" cellspacing="0" cellpadding="0"> <tr> <td colspan="2"><div align="center">Datos del tiempo</div></td> </tr> <tr> <td width="147">&nbsp;</td> <td width="220">&nbsp;</td> </tr> <tr> <td>Nombre:</td> <td><?=$aRespuesta["station"]["name"];?></td> </tr> <tr> <td>Elevaci&oacute;n:</td> <td><?=$aRespuesta["station"]["elevation"]; ?></td> </tr> <tr> <td>Fecha y Hora:</td> <td><?=$aRespuesta["timestamp"];?></td> </tr> <tr> <td>Pa&iacute;s:</td> <td><?=$aRespuesta["station"]["country"];?></td> </tr> <tr> <td>Latitud:</td> <td><?=$aRespuesta["station"]["latitude"];?></td> </tr> <tr> <td>Longitud:</td> <td><?=$aRespuesta["station"]["longitude"];?></td> </tr> <tr> <td>Presi&oacute;n:</td> <td><?=$aRespuesta["pressure"]["string"];?></td> </tr> <tr> <td>Temperatura:</td> <td><?=$aRespuesta["temperature"]["string"];?></td> </tr> <tr> <td>Visibilidad:</td> <td><?=$aRespuesta["visibility"]["distance"];?> mts.</td> </tr> </table> </body> </html>

M. en C. Alejandro Cifuentes A.

Pgina 16

You might also like