Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/servicioWeb»

De WikiEducator
Saltar a: navegación, buscar
(Utilizar el servicio sin el fichero wsdl)
 
(25 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
http://www.w3c.es/Divulgacion/GuiasBreves/ServiciosWeb
+
__NOTOC__
=Qué es un servicio web=
+
{{:Usuario:ManuelRomero/PHP/servicioWeb/nav}}
*Es una aplicación disponible en la web que responde a una solicitud de otra aplicación.
+
{{objetivos|
*La solicitud puede implicar solicitud de datos o realizar acciones.
+
*Ver el concepto de un servicio web
*Esto facilita que nuestras aplicaciones puedan ser usadas por otras aplicaciones en la web.
+
*Estudiar SOAP como una protocolo estandarizado para implementar servicios
 
+
*Estudiar el concepto de REST como una interfaz web estándar para definir y usar servicios web
[[Archivo:servicioWeb1.png|500px]]
+
*Toda implementación se hará usando php
 
+
*En el caso de SOAP usaremos la extensión SOAP php tanto para crearlo como para consumirlos
En la imagen vemos cómo un cliente solicita una página web, y para poder visualizar la información, ésta solicita información a otra, que se la solicita a otra ,...
+
*En el caso de REST usaremos la extensión curl para consumir los servicios web}}
Usar o crear un servicio web es una buena solución cuando queremos que una aplicación comparta información con otra u otras, o cuando quieres usar el resultado que una aplicación produce a otra sin que esta segunda acceda directamente a los datos.
+
 
+
Supongamos que hacemos una aplicación que gestiona libros y los almacena en una base de datos. Posteriormente realizamos otra aplicación u otra persona desarrolla otra aplicación que necesita los libros que la primera gestionó. Una solución es ofrecer la base de datos a esta segunda aplicación.
+
 
+
[[Archivo:servicioWeb2.png]]
+
 
+
Pero esta no es una solución buena en todos los casos; primero por rendimiento y segundo por temas de seguridad o confidencialidad. Una segunda solución es que la app 1 se convirtiera en un servicio web que lo pudieran consultar otras aplicaciones en los términos que yo decida. Además usar la aplicación primera implica usar toda la lógica de negocio que en ella haya plasmado
+
 
+
[[Archivo:servicioWeb3.png]]
+
 
+
==Características de un servicicio Web==
+
*Los servicios web se crearon para permitir el intercambio de información.
+
*Para este cometido hay muchos protocolos de nivel de aplicacion (FTP, telnet, ssh, pop3, smtp, ...).
+
*Por ser un servicio web el protocolo base será  HTTP (de ahí el término web).
+
 
+
A diferencia de lo que estamos acostumbrados hasta ahora donde un cliente utiliza este protocolo y obtiene como resultado una página web,la respuesta  obtenida ahora, no será una página web, sino la información que se solicitó, o bien haber realizado la acción solicitada.
+
 
+
Por tanto, cualquier ordenador que pueda consultar una página web, podrá también solicitar información de un servicio web y utilizarlo
+
 
+
Ahora entre otras cuestiones, para poder crear un servicio web, o bien usar un servicio web existente, debemos tener claro:
+
#Cómo crear la solicitud y como construir la respuesta para el cliente
+
#Cómo conocer o publicar las funciones para que el cliente las utilice
+
 
+
*Dependiendo de la tecnología o estándar que vamos a utilizar para implementar el servicio web,  estas cuestiones se resolverán de diferentes formas.
+
 
+
*Existen dos formas mas o menos estandares que son SOAP y REST.
+
*Ambas se usan bastante, si bien para desarrollos rápidos se usa mucho mas REST. por ser más rápida e intuitiva. No obstante para temas de seguridad y estandarización, SOAP tiene mucho camino ganado a REST.
+
 
+
*En este cusro veremos las dos formas de crear/usar servicios web. En este tema abordaremos SOAP, dejando REST para verlo junto con '''''laravel'''''
+
 
+
[[Imagen:SoapVsRest2.png|400px]]
+
*A continuación una imagen que no sin razón valora la ligereza de REST frente a SOAP
+
[[Imagen:SoapVsRest.png|600px]]
+
===SOAP===
+
*Es un protocolo que indica cómo se tienen que intercambiar mensajes entre cliente y servidor
+
*Utiliza '''''xml''''' para este intercambio
+
*'''''SOAP''''' se acompaña de un lenguaje llamada '''''WSDL''''', usado para describir y publicar las funciones que el servicio ofrece a sus clientes.
+
*A continuación vamos a entender y profundizar en las diferentes partes de un fichero ''xml'' de soap para poder entenderlo
+
====Fichero xml que soap crea para el intercambio====
+
Un mensaje '''''SOAP''''' viaja en un fichero ''xml'' con la siguiente estructura
+
 
+
#Elemento principal o '''''Envelope''''' o elemento raiź  que identifica el mensaje
+
#cabecera o header opcional. se componen de uno o varios '''''header blocks'''''; cada uno de ellos detalla como se debe procesar el mensaje
+
#body : Es una parte obligatoria, y  contiene la información relativa a la llamada y la respuesta.
+
[[Archivo:xmlSoap1.png]]
+
En el elemento Envelope se especifica la versión de soap
+
*En la version 1.1
+
<source lang=xml>
+
<soap:Envelope
+
  xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
+
  soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
+
</source>
+
*En la versión 1.2
+
<source lang=xml>
+
<soap:Envelope
+
  xmlns:soap=http://www.w3.org/2003/05/soap-envelope/"
+
  http://www.w3.org/2003/05/soap-encoding/">
+
</source>
+
La gestión de este fichero, tanto el hecho de crearlo para responder a una solicitud como la tarea de leerlo e interpretarlo, sería un labor tediosa. Existen librerías en los diferentes lenguajes de programación que automatizan este proceso. Para php vamos a ver PHP5 SOAP, disponible a partir de la versión 5
+
 
+
'''''PHP5 SOAP''''' es la implementación de SOAP que se incluye con PHP a partir de la versión 5 del lenguaje. En versiones anteriores se tenía que recurrir a otras opciones para trabajar con SOAP. Es una extensión nativa (escrita en lenguaje C) y por tanto más rápida que otras posibilidades (NuSOAP -http://code.google.com/p/nusoap-for-php5/- o PEAR::SOAP --). Como veremos más adelante, su gran inconveniente es que no permite la generación automática del documento WSDL una vez programado el servidor SOAP correspondiente.
+
 
+
====Describir un servicio====
+
*Consiste es publicar qué funciones ofrece mi servicio web, así como qué parámetros necesita y que valor/es retorna dicha función.
+
*Este paso es importante sobre todo si no es la personas que ha desarrollado el servicio la  única que va a utilizarlo.
+
*En ''SOAP'' esto se hace usando el leguaje de descrición '''''WSDL''''' ''(Lenguaje de Descripción de Servicios Web)''.
+
 
+
'''''WSDL''''' es un lenguaje basado en ''xml'' que utiliza unas reglas determinadas para generar el documento de descripción de un servicio web.
+
*Una vez generado, ese documento se suele poner a disposición de los posibles usuarios del servicio (normalmente se accede al documento WSDL añadiendo ?wsdl a la URL del servicio).
+
 
+
*En la siguiente imagen podemos ver las diferentes partes de un fichero xml wsdl.
+
*Podemos observar como cambia según estemos en la version 1.1 o la versión 2.
+
 
+
[[Archivo:wsdlMRM.png]]
+
 
+
;types y message
+
*En la versión 2 solo existe el elemento types
+
*Describe las definiciones de tipos de datos que se usan en el servicio, como lista de parámetros que recibe una función o los valores que retorna
+
;portType o interfaces
+
Cada uno de estos elementos es cada una de las funciones que el servicio ofrece
+
Cada función se define es una '''operation''' con sus '''input''' y '''output''' como podemos ver en la imagen
+
;binding
+
*Define como va a transmitirse la información de cada '''''portType'''''
+
;service
+
*Contiene una lista de las diferentes url (1 o varias) en donde se puede acceder al servicio web
+
*Definir, construir e interpretar el contenido de un fichero wsdl, puede ser de nuevo una tarea de gran calibre
+
*En lugar de hacerlo, usaremos herramientas que nos construyan este  fichero como vamos a ver a continuación
+
 
+
===PHP SOAP===
+
*Pasa implementar un servicio web vamos a usar esta exténsión nativa de php.
+
*Primero verificamos que la tenemos instalada
+
*Ejecutamos un phpinfo() y buscamos la sección de soap
+
[[Archivo:phpSoap.png]]
+
*Esta extensión nos permite usar dos clases importantes SoapClient (para comunicarnos con un servicio web) y SoapServer (para crear un propio servicio web).
+
 
+
===Usando un servicio web===
+
<br/>
+
{{Actividad|usar un servicio web de webservicex para la conversión de dólares a euros }}
+
*Vamos a usar un servicio web mediante el protocolo o estándar SOAP.
+
*Suponemos que queremos tener de forma actualizada la conversión de euros a doláres y viceversa.
+
*En lugar de hacerlo a mano queremos una actualización en el momento de calcular un precio, y para ello vamos a usar un servicio disponible en WebSeviceX.net (http://www.webservicex.net/ws/default.aspx).
+
*En la página podemos ver varios servicios, usaremos el de Currency Convertor  (http://www.webservicex.net/ws/WSDetails.aspx?CATID=2&WSID=10).
+
 
+
*Dentro de la página localizamos el fichero descriptor wsdl del servicio
+
http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
+
*A partir de este fichero podemos deducir la siguiente información:
+
;1.- El alias del espacio de nombres correspondiente al XML Schema que utiliza el documento es'''''s'''''
+
<source lang=xml>
+
<wsdl:definitions
+
...
+
  xmlns:s="http://www.w3.org/2001/XMLSchema"
+
...
+
>
+
</source>
+
;2.-El tipo Currency debe ser un string de tres caracteres de los que se listan en el documento, correspondiente a las siglas de una divisa.
+
<source lang=xml>
+
<s:simpleType name="Currency">
+
  <s:restriction base="s:string">
+
    <s:enumeration value="AFA" />
+
    …
+
  </s:restriction>
+
</s:simpleType>
+
;3.-El tipo ConversionRate es una secuencia de dos elementos Currency.
+
<source lang=xml>
+
<s:element name="ConversionRate">
+
<s:complexType>
+
  <s:sequence>
+
    <s:element
+
        minOccurs="1" maxOccurs="1"
+
        name="FromCurrency" type="tns:Currency"
+
    />
+
    <s:element
+
        name="ToCurrency" type="tns:Currency"
+
    />
+
  </s:sequence>
+
</s:complexType>
+
</s:element>
+
;3.-El tipo ConversionRateResponse es un double.
+
<source lang=xml>
+
<s:element name="ConversionRateResponse">
+
<s:complexType>
+
  <s:sequence>
+
    <s:element
+
        minOccurs="1" maxOccurs="1"
+
        name="ConversionRateResult" type="s:double"
+
    />
+
  </s:sequence>
+
</s:complexType>
+
</s:element>
+
</source>
+
 
+
*En resumen tenemos la siguiente información
+
funcion :  ConversionRate
+
parámetros : array ("FromCurrency" =>"XXX", "ToCurrenci"=>"XXX");
+
valor que retorna : ConversionRateResult() que es un float
+
 
+
 
+
====Escribiendo el código====
+
*Ahora vamos a escribir el código php para usar este servicio
+
*Primero creamos un objeto de la clase '''''SoapClient'''''
+
*El objeto de la clase ''SoapClient'', necesita en el constructor la ubiación del fichero '''''wsdl'''''
+
(Luego veremos que también puede ser valor null, y especificarlo posteriormente
+
<source lang=php>
+
    $cliente = new SoapClient(  "http://www.webservicex.net/CurrencyConvertor.asmx?WSDL");
+
</source>
+
*Ahora a continuación vamos a realizar la llamada a la función de conversión que ofrece este servicio
+
*La función se llama '''''ConversionRate''''' como podemos ver en el elemento descrito anteriormente. Esta funcion recibe como parámetro un array asociativo con dos valores
+
*En este calso queremos pasar de Euros a Dólares
+
<source lang=php>
+
  $parametros = array("FromCurrency" => "EUR", "ToCurrency" => "USD");
+
  $tasa = $cliente->ConversionRate($parametros);
+
</source>
+
 
+
*Y ahora solo queda capturar el resultado y visualizarlo
+
<source lang=php>
+
  print("Resultado: ".$tasa->ConversionRateResult);
+
</source>
+
 
+
===Utilizar el servicio sin el fichero wsdl===
+
*Es posible no utilizar el fichero wsdl, por que no exista o por que no conocemos su ubicación
+
*En el segundo caso, si no indicas en el constructor un documento WSDL (bien porque no existe, o porque necesitas configurar manualmente alguna opción), el primer parámetro debe ser null, y las opciones para comunicarse con el servicio las tendrás que establecer en un array que se pasa como segundo parámetro.
+
 
+
*Si el fichero wsdl existe puedes usar una herramienta (hay varias), que te conviertan el fichero wsdl a php e incluirlo en tu fichero php
+
*En este caso vamos a usar la herramienta wsdl2php http://www.urdalen.no/wsdl2php/index.php
+
*Descargamos el fichero http://sourceforge.net/projects/wsdl2php/files/latest/download
+
*Una vez descargado el fichero lo instalamos en línea de comandos
+
sudo pear install wsdl2php-0.2.1-pear.tgz
+
*Y ahora  con la ubicación del fichero wsdl generamos el php
+
wsdl2php http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
+
*Analiza y genera el fichero php que podemos ver con información clara y completa
+
 
+
{{Actividad|Realizamos una aplicación que pueda covertir una cantidad de un tipo de moneda en otra según seleccionemos con un combo box o campo de tipo select}}
+
<source lang=php>
+
<!DOCTYPE html>
+
<html>
+
    <head>
+
        <title>conversion de monedas</title>
+
        <meta charset="UTF-8">
+
        <meta name="viewport"content="width=device-width, initial-scale=1.0">
+
    </head>
+
    <body>
+
        <form action=""method ="POST">
+
            Importe en euros <input type="text"name="euros">
+
            selecciona importe destino
+
            <select name="moneda"id="">
+
                <option value ="ALL">ALL</option>
+
                <option value ="DZD">DZD</option>
+
                <option value ="ARS">ARS</option>
+
                <option value ="AWG">AWG</option>
+
                <option value ="AUD">AUD</option>
+
                <option value ="BSD">BSD</option>
+
                <option value ="BHD">BHD</option>
+
                <option value ="BDT">BDT</option>
+
                <option value ="BBD">BBD</option>
+
                <option value ="BZD">BZD</option>
+
                <option value ="BMD">BMD</option>
+
                <option value ="BTN">BTN</option>
+
                <option value ="BOB">BOB</option>
+
                <option value ="BWP">BWP</option>
+
                <option value ="BRL">BRL</option>
+
                <option value ="GBP">GBP</option>
+
                <option value ="BND">BND</option>
+
                <option value ="BIF">BIF</option>
+
                <option value ="XOF">XOF</option>
+
                <option value ="XAF">XAF</option>
+
                <option value ="KHR">KHR</option>
+
                <option value ="CAD">CAD</option>
+
                <option value ="CVE">CVE</option>
+
                <option value ="KYD">KYD</option>
+
                <option value ="CLP">CLP</option>
+
                <option value ="CNY">CNY</option>
+
                <option value ="COP">COP</option>
+
                <option value ="KMF">KMF</option>
+
                <option value ="CRC">CRC</option>
+
                <option value ="HRK">HRK</option>
+
                <option value ="CUP">CUP</option>
+
                <option value ="CYP">CYP</option>
+
                <option value ="CZK">CZK</option>
+
                <option value ="DKK">DKK</option>
+
                <option value ="DJF">DJF</option>
+
                <option value ="DOP">DOP</option>
+
                <option value ="XCD">XCD</option>
+
                <option value ="EGP">EGP</option>
+
                <option value ="SVC">SVC</option>
+
                <option value ="EEK">EEK</option>
+
                <option value ="ETB">ETB</option>
+
                <option value ="EUR">EUR</option>
+
                <option value ="FKP">FKP</option>
+
                <option value ="GMD">GMD</option>
+
                <option value ="GHC">GHC</option>
+
                <option value ="GIP">GIP</option>
+
                <option value ="XAU">XAU</option>
+
                <option value ="GTQ">GTQ</option>
+
                <option value ="GNF">GNF</option>
+
                <option value ="GYD">GYD</option>
+
                <option value ="HTG">HTG</option>
+
                <option value ="HNL">HNL</option>
+
                <option value ="HKD">HKD</option>
+
                <option value ="HUF">HUF</option>
+
                <option value ="ISK">ISK</option>
+
                <option value ="INR">INR</option>
+
                <option value ="IDR">IDR</option>
+
                <option value ="IQD">IQD</option>
+
                <option value ="ILS">ILS</option>
+
                <option value ="JMD">JMD</option>
+
                <option value ="JPY">JPY</option>
+
                <option value ="JOD">JOD</option>
+
                <option value ="KZT">KZT</option>
+
                <option value ="KES">KES</option>
+
                <option value ="KRW">KRW</option>
+
                <option value ="KWD">KWD</option>
+
                <option value ="LAK">LAK</option>
+
                <option value ="LVL">LVL</option>
+
                <option value ="LBP">LBP</option>
+
                <option value ="LSL">LSL</option>
+
                <option value ="LRD">LRD</option>
+
                <option value ="LYD">LYD</option>
+
                <option value ="LTL">LTL</option>
+
                <option value ="MOP">MOP</option>
+
                <option value ="MKD">MKD</option>
+
                <option value ="MGF">MGF</option>
+
                <option value ="MWK">MWK</option>
+
                <option value ="MYR">MYR</option>
+
                <option value ="MVR">MVR</option>
+
                <option value ="MTL">MTL</option>
+
                <option value ="MRO">MRO</option>
+
                <option value ="MUR">MUR</option>
+
                <option value ="MXN">MXN</option>
+
                <option value ="MDL">MDL</option>
+
                <option value ="MNT">MNT</option>
+
                <option value ="MAD">MAD</option>
+
                <option value ="MZM">MZM</option>
+
                <option value ="MMK">MMK</option>
+
                <option value ="NAD">NAD</option>
+
                <option value ="NPR">NPR</option>
+
                <option value ="ANG">ANG</option>
+
                <option value ="NZD">NZD</option>
+
                <option value ="NIO">NIO</option>
+
                <option value ="NGN">NGN</option>
+
                <option value ="KPW">KPW</option>
+
                <option value ="NOK">NOK</option>
+
                <option value ="OMR">OMR</option>
+
                <option value ="XPF">XPF</option>
+
                <option value ="PKR">PKR</option>
+
                <option value ="XPD">XPD</option>
+
                <option value ="PAB">PAB</option>
+
                <option value ="PGK">PGK</option>
+
                <option value ="PYG">PYG</option>
+
                <option value ="PEN">PEN</option>
+
                <option value ="PHP">PHP</option>
+
                <option value ="XPT">XPT</option>
+
                <option value ="PLN">PLN</option>
+
                <option value ="QAR">QAR</option>
+
                <option value ="ROL">ROL</option>
+
                <option value ="RUB">RUB</option>
+
                <option value ="WST">WST</option>
+
                <option value ="STD">STD</option>
+
                <option value ="SAR">SAR</option>
+
                <option value ="SCR">SCR</option>
+
                <option value ="SLL">SLL</option>
+
                <option value ="XAG">XAG</option>
+
                <option value ="SGD">SGD</option>
+
                <option value ="SKK">SKK</option>
+
                <option value ="SIT">SIT</option>
+
                <option value ="SBD">SBD</option>
+
                <option value ="SOS">SOS</option>
+
                <option value ="ZAR">ZAR</option>
+
                <option value ="LKR">LKR</option>
+
                <option value ="SHP">SHP</option>
+
                <option value ="SDD">SDD</option>
+
                <option value ="SRG">SRG</option>
+
                <option value ="SZL">SZL</option>
+
                <option value ="SEK">SEK</option>
+
                <option value ="CHF">CHF</option>
+
                <option value ="SYP">SYP</option>
+
                <option value ="TWD">TWD</option>
+
                <option value ="TZS">TZS</option>
+
                <option value ="THB">THB</option>
+
                <option value ="TOP">TOP</option>
+
                <option value ="TTD">TTD</option>
+
                <option value ="TND">TND</option>
+
                <option value ="TRL">TRL</option>
+
                <option value ="USD">USD</option>
+
                <option value ="AED">AED</option>
+
                <option value ="UGX">UGX</option>
+
                <option value ="UAH">UAH</option>
+
                <option value ="UYU">UYU</option>
+
                <option value ="VUV">VUV</option>
+
                <option value ="VEB">VEB</option>
+
                <option value ="VND">VND</option>
+
                <option value ="YER">YER</option>
+
                <option value ="YUM">YUM</option>
+
                <option value ="ZMK">ZMK</option>
+
                <option value ="ZWD">ZWD</option>
+
                <option value ="_TRY">TRY</option>
+
            </select>
+
            <input type="submit"name ="enviar"/>
+
        </form>
+
    </body>
+
</html>
+
<?php
+
if ($_POST['enviar']){
+
 
+
$cliente = new SoapClient("http://www.webservicex.net/CurrencyConvertor.asmx?WSDL");
+
$parametros = array("FromCurrency"=> "EUR", "ToCurrency"=> $_POST['moneda']);
+
$tasa = $cliente->ConversionRate($parametros);
+
// $tasa  es  un objeto de una clase predefinida en PHP llamada StdClass. Para utilizar el valor devuelto, puedes hacer:
+
$cantidad = $_POST['euros'];
+
print("Resultado: $cantidad=".($cantidad* $tasa->ConversionRateResult));
+
}
+
?>
+
 
+
</source>
+
 
+
<!--
+
<source lang=php>
+
<?php
+
require_once("./CurrencyConvertor.php");
+
 
+
//Creamos un objeto de la clase
+
 
+
$cliente = new CurrencyConvertor();
+
 
+
//Ahora para los parámetros
+
$p=new ConversionRate();
+
 
+
$p->FromCurrency="EUR";
+
$p->ToCurrency="USD";
+
 
+
//Ahora invocamos el método de convertir
+
 
+
$r=$cliente->ConversionRate($p);
+
 
+
print_r ("Valor de un euro:". $r->ConversionRateResult);
+
?>
+
</source>
+
-->
+
{{Actividad|
+
*Inspecciona el servicio disponible en la URL http://www.webservicex.com/globalweather.asmx.
+
*Ofrece información meteorológica sobre distintas ciudades de todo el mundo.
+
* A partir de su documento WSDL, utiliza la herramienta wsdl2php y, partiendo de las clases que ésta genera, crea el código PHP necesario para mostrar las ciudades españolas de las que ofrece información, y la predicción meteorológica para la ciudad de Santiago de Compostela.
+
}}
+
<!--
+
<source lang=xml>
+
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.webserviceX.NET" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://www.webserviceX.NET">
+
<wsdl:types>
+
<s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET">
+
<s:element name="GetWeather">
+
<s:complexType>
+
<s:sequence>
+
<s:element minOccurs="0" maxOccurs="1" name="CityName" type="s:string"/>
+
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string"/>
+
</s:sequence>
+
</s:complexType>
+
</s:element>
+
<s:element name="GetWeatherResponse">
+
<s:complexType>
+
<s:sequence>
+
<s:element minOccurs="0" maxOccurs="1" name="GetWeatherResult" type="s:string"/>
+
</s:sequence>
+
</s:complexType>
+
</s:element>
+
<s:element name="GetCitiesByCountry">
+
<s:complexType>
+
<s:sequence>
+
<s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string"/>
+
</s:sequence>
+
</s:complexType>
+
</s:element>
+
<s:element name="GetCitiesByCountryResponse">
+
<s:complexType>
+
<s:sequence>
+
<s:element minOccurs="0" maxOccurs="1" name="GetCitiesByCountryResult" type="s:string"/>
+
</s:sequence>
+
</s:complexType>
+
</s:element>
+
<s:element name="string" nillable="true" type="s:string"/>
+
</s:schema>
+
</wsdl:types>
+
<wsdl:message name="GetWeatherSoapIn">
+
<wsdl:part name="parameters" element="tns:GetWeather"/>
+
</wsdl:message>
+
<wsdl:message name="GetWeatherSoapOut">
+
<wsdl:part name="parameters" element="tns:GetWeatherResponse"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountrySoapIn">
+
<wsdl:part name="parameters" element="tns:GetCitiesByCountry"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountrySoapOut">
+
<wsdl:part name="parameters" element="tns:GetCitiesByCountryResponse"/>
+
</wsdl:message>
+
<wsdl:message name="GetWeatherHttpGetIn">
+
<wsdl:part name="CityName" type="s:string"/>
+
<wsdl:part name="CountryName" type="s:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetWeatherHttpGetOut">
+
<wsdl:part name="Body" element="tns:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountryHttpGetIn">
+
<wsdl:part name="CountryName" type="s:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountryHttpGetOut">
+
<wsdl:part name="Body" element="tns:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetWeatherHttpPostIn">
+
<wsdl:part name="CityName" type="s:string"/>
+
<wsdl:part name="CountryName" type="s:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetWeatherHttpPostOut">
+
<wsdl:part name="Body" element="tns:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountryHttpPostIn">
+
<wsdl:part name="CountryName" type="s:string"/>
+
</wsdl:message>
+
<wsdl:message name="GetCitiesByCountryHttpPostOut">
+
<wsdl:part name="Body" element="tns:string"/>
+
</wsdl:message>
+
<wsdl:portType name="GlobalWeatherSoap">
+
<wsdl:operation name="GetWeather">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
Get weather report for all major cities around the world.
+
</wsdl:documentation>
+
<wsdl:input message="tns:GetWeatherSoapIn"/>
+
<wsdl:output message="tns:GetWeatherSoapOut"/>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</wsdl:documentation>
+
<wsdl:input message="tns:GetCitiesByCountrySoapIn"/>
+
<wsdl:output message="tns:GetCitiesByCountrySoapOut"/>
+
</wsdl:operation>
+
</wsdl:portType>
+
<wsdl:portType name="GlobalWeatherHttpGet">
+
<wsdl:operation name="GetWeather">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
Get weather report for all major cities around the world.
+
</wsdl:documentation>
+
<wsdl:input message="tns:GetWeatherHttpGetIn"/>
+
<wsdl:output message="tns:GetWeatherHttpGetOut"/>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</wsdl:documentation>
+
<wsdl:input message="tns:GetCitiesByCountryHttpGetIn"/>
+
<wsdl:output message="tns:GetCitiesByCountryHttpGetOut"/>
+
</wsdl:operation>
+
</wsdl:portType>
+
<wsdl:portType name="GlobalWeatherHttpPost">
+
<wsdl:operation name="GetWeather">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
+
Get weather report for all major cities around the world.
+
</wsdl:documentation>
+
<wsdl:input message="tns:GetWeatherHttpPostIn"/>
+
<wsdl:output message="tns:GetWeatherHttpPostOut"/>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</wsdl:documentation>
+
<wsdl:input message="tns:GetCitiesByCountryHttpPostIn"/>
+
<wsdl:output message="tns:GetCitiesByCountryHttpPostOut"/>
+
</wsdl:operation>
+
</wsdl:portType>
+
<wsdl:binding name="GlobalWeatherSoap" type="tns:GlobalWeatherSoap">
+
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
+
<wsdl:operation name="GetWeather">
+
<soap:operation soapAction="http://www.webserviceX.NET/GetWeather" style="document"/>
+
<wsdl:input>
+
<soap:body use="literal"/>
+
</wsdl:input>
+
<wsdl:output>
+
<soap:body use="literal"/>
+
</wsdl:output>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<soap:operation soapAction="http://www.webserviceX.NET/GetCitiesByCountry" style="document"/>
+
<wsdl:input>
+
<soap:body use="literal"/>
+
</wsdl:input>
+
<wsdl:output>
+
<soap:body use="literal"/>
+
</wsdl:output>
+
</wsdl:operation>
+
</wsdl:binding>
+
<wsdl:binding name="GlobalWeatherSoap12" type="tns:GlobalWeatherSoap">
+
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
+
<wsdl:operation name="GetWeather">
+
<soap12:operation soapAction="http://www.webserviceX.NET/GetWeather" style="document"/>
+
<wsdl:input>
+
<soap12:body use="literal"/>
+
</wsdl:input>
+
<wsdl:output>
+
<soap12:body use="literal"/>
+
</wsdl:output>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<soap12:operation soapAction="http://www.webserviceX.NET/GetCitiesByCountry" style="document"/>
+
<wsdl:input>
+
<soap12:body use="literal"/>
+
</wsdl:input>
+
<wsdl:output>
+
<soap12:body use="literal"/>
+
</wsdl:output>
+
</wsdl:operation>
+
</wsdl:binding>
+
<wsdl:binding name="GlobalWeatherHttpGet" type="tns:GlobalWeatherHttpGet">
+
<http:binding verb="GET"/>
+
<wsdl:operation name="GetWeather">
+
<http:operation location="/GetWeather"/>
+
<wsdl:input>
+
<http:urlEncoded/>
+
</wsdl:input>
+
<wsdl:output>
+
<mime:mimeXml part="Body"/>
+
</wsdl:output>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<http:operation location="/GetCitiesByCountry"/>
+
<wsdl:input>
+
<http:urlEncoded/>
+
</wsdl:input>
+
<wsdl:output>
+
<mime:mimeXml part="Body"/>
+
</wsdl:output>
+
</wsdl:operation>
+
</wsdl:binding>
+
<wsdl:binding name="GlobalWeatherHttpPost" type="tns:GlobalWeatherHttpPost">
+
<http:binding verb="POST"/>
+
<wsdl:operation name="GetWeather">
+
<http:operation location="/GetWeather"/>
+
<wsdl:input>
+
<mime:content type="application/x-www-form-urlencoded"/>
+
</wsdl:input>
+
<wsdl:output>
+
<mime:mimeXml part="Body"/>
+
</wsdl:output>
+
</wsdl:operation>
+
<wsdl:operation name="GetCitiesByCountry">
+
<http:operation location="/GetCitiesByCountry"/>
+
<wsdl:input>
+
<mime:content type="application/x-www-form-urlencoded"/>
+
</wsdl:input>
+
<wsdl:output>
+
<mime:mimeXml part="Body"/>
+
</wsdl:output>
+
</wsdl:operation>
+
</wsdl:binding>
+
<wsdl:service name="GlobalWeather">
+
<wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap">
+
<soap:address location="http://www.webservicex.com/globalweather.asmx"/>
+
</wsdl:port>
+
<wsdl:port name="GlobalWeatherSoap12" binding="tns:GlobalWeatherSoap12">
+
<soap12:address location="http://www.webservicex.com/globalweather.asmx"/>
+
</wsdl:port>
+
<wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet">
+
<http:address location="http://www.webservicex.com/globalweather.asmx"/>
+
</wsdl:port>
+
<wsdl:port name="GlobalWeatherHttpPost" binding="tns:GlobalWeatherHttpPost">
+
<http:address location="http://www.webservicex.com/globalweather.asmx"/>
+
</wsdl:port>
+
</wsdl:service>
+
</wsdl:definitions>
+
</source>
+
-->
+
{{Nota|Tras ejecutar wsdl2php pasándole como parámetro la URL http://www.webservicex.com/globalweather.asmx?wsdl, correspondiente al documento WSDL del servicio web, obtendrás un fichero GlobalWeather.php con las clases correspondientes al servicio. Para ejecutar la consulta al servicio y mostrar la información que se pide, puedes ejecutar un código como el que se propone en la solución al ejercicio.}}
+
<!--
+
<source lang=php>
+
<?php
+
require_once('GlobalWeather.php');
+
 
+
//Creamos un cliente para llamar a esa URL.
+
$tiempo = new GlobalWeather();
+
//Llamamos a la operación suma (tenemos que saber nosotros que existe)
+
$pais = new GetCitiesByCountry();
+
$pais->CountryName="SPAIN";
+
$ciudades = $tiempo->GetCitiesByCountry($pais);
+
print_r($ciudades);
+
 
+
$ciudad = new GetWeather();
+
$ciudad->CountryName="SPAIN";
+
$ciudad->CityName = "Santiago / Labacolla";
+
 
+
$tiempociudad = $tiempo->GetWeather($ciudad);
+
print_r($tiempociudad);
+
 
+
?>
+
</source>
+
-->
+
 
+
  
 
{{Recursos de la Web|
 
{{Recursos de la Web|

Última revisión de 00:45 31 ene 2016




Icon objectives.jpg

Objetivos

  • Ver el concepto de un servicio web
  • Estudiar SOAP como una protocolo estandarizado para implementar servicios
  • Estudiar el concepto de REST como una interfaz web estándar para definir y usar servicios web
  • Toda implementación se hará usando php
  • En el caso de SOAP usaremos la extensión SOAP php tanto para crearlo como para consumirlos
  • En el caso de REST usaremos la extensión curl para consumir los servicios web






Icon inter.gif

Recursos de la Web