Usuario:ManuelRomero/PHP/servicioWeb/soap

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

En el elemento Envelope se especifica la versión de soap 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
 * 1) Elemento principal o Envelope o elemento raiź que identifica el mensaje
 * 2) cabecera o header opcional. se componen de uno o varios header blocks; cada uno de ellos detalla como se debe procesar el mensaje
 * 3) body : Es una parte obligatoria, y contiene la información relativa a la llamada y la respuesta.
 * En la version 1.1
 * En la versión 1.2

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.



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
 * 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
 * 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
 * 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

 * 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).

http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
 * Dentro de la página localizamos el fichero descriptor wsdl del servicio
 * 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 ess
 * 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.

funcion : ConversionRate parámetros : array ("FromCurrency" =>"XXX", "ToCurrenci"=>"XXX"); valor que retorna : ConversionRateResult que es un float
 * En resumen tenemos la siguiente información

Escribiendo el código
(Luego veremos que también puede ser valor null, y especificarlo posteriormente
 * 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
 * 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


 * Y ahora solo queda capturar el resultado y visualizarlo

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.

sudo pear install wsdl2php-0.2.1-pear.tgz wsdl2php http://www.webservicex.net/CurrencyConvertor.asmx?WSDL
 * 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
 * Y ahora con la ubicación del fichero wsdl generamos el php
 * Analiza y genera el fichero php que podemos ver con información clara y completa

Implementado un servicio SOAP

 * Ahora vamos a crear un servicio para utilizarlo y ofrecerlo a terceros
 * Para crear un servicio web, usaremos la clase ServerSoap, que podemos ver en la imagen siguiente:
 * Para ello vamos a crear el servicio y luego consumirlo.
 * En este caso como conocemos las funciones que el servicio ofrece, no necesitamos usar ningún fichero de descripción wsdl
 * Los pasos a seguir para este cometido son sencillos
 * 1) Creamos las funciones dque queremos que nuestro servicio ofrezca
 * 2) Creamos el objeto soapServer
 * 3) Añadimos las funciones al objeto ServerSoap creado previamente
 * Creamos las funciones
 * Creando el objeto
 * Para ello debemos establecer el uri del servicio
 * El objeto constructor tiene dos poarámetros
 * 1) $ficheroWsdl es el fichero que especifica las funciones que ofrece el servicio. En nuestro caso especificaremos null, pues  no vamos a usar ningún fichero
 * 2) array asociativo con diferentes posibles valores (ver documentacion http://php.net/manual/es/soapserver.soapserver.php). Nosotros aquí especificaremos la uri
 * Añadiendo las funciones que nuestro servicio web ofrece
 * Ahora solo nos queda añadir las funciones que queremos ofrecer
 * Para ello usamos el método addFunction(..) de la clase SoapServer
 * Vemos como al final activamos nuestro servicio con el método manejador o handle
 * Consumiendo el servicio
 * Ahora solo nos queda consumir el servicio igual que hicimos en el ejemplo del apartado anterior
 * Se escribe otro proyecto con el siguiente código, comentarios en el própio código

(a/b op c/d). (op = +|-|*|:)
 * Ahora podemos probar a usar nuestra las operaciones de nuestra calculadora racional como un servicio web.
 * La idea es que cualquiera pueda hacer operaciones del tipo

valor de la suma 5/4 + 4/3 = 31/12 valor de la suma 5/4 + 5 = 25/4 valor de la suma 5 + 4 = 9/1 valor de la suma + 3 = 4/1 valor de la resta 9
 * Con las siguientes llamadas en cliente
 * Se generará la siguiente salida
 * Opcionalmente mejoralo haciendo que en cliente tenga dos cajas de texto para sumandos y una para resultado.

Creación de un servicio web con fichero wsdl

 * Ahora crearemos un servicio web publicando nuestras funciones de nuestro servicio a través del fichero descriptor del servicio wsdl
 * En dos apartados anteriores estudiamos como era el contenido y la estructura de este documento.
 * Para el nivel en el que vamos a profundizar, usaremos herramientas para su construcción, pues su conocimiento puede resultar un poco tedioso, aunque si nos dedicáramos a construir servicios con esta tecnología seguro que lo aprenderíamos y sacaríamos buen rendimiento a dichos conocimientos.
 * En cualquier caso, como veremos a continuación siempre conviene revisar el resultado del fichero wsdl generado de forma automática por algún tipo de software


 * Primero debemos actualizar en el fichero php.ini la dierectiva soap.wsdl_cache_enabled = 0 si la teníamos a 1. Esto es para que los cambios que hagamos en el fichero wsdl tengan efectos inmediatos. No olvides rebotar el servicio para que la modificación tenga efecto.

Creando las funciones a compartir

 * A la hora de implementar las funciones que se quieren compartir en el servicio web, se recomienda crear una clase, e incorporar como métodos las funciones a compartir.
 * En el ejemplo básico del caso anterior, que queríamos compartir sumar y restar procederíamos del siguiente modo
 * Ahora para añadir la clase en lugar de addFunction(...), usaríamos setClase(...)

Generando el fichero wsdl
https://code.google.com/p/wsdldocument/ http://www.phpdoc.org/
 * Para este cometido vamos a usar una herramienta que automatiza el proceso
 * Como hemos comentado anteriormente conviene revisar el fichero generado
 * La herramienta se llama wsdlDocument
 * Primero procedemos a descargarla
 * Al darle a descagar, se descarga un fichero zip
 * Este fichero debemos descomprimirlo donde tengamos el proyecto que queramos usar
 * Posteriormente en el fichero del servidor incluiremos la clase WSDLDocumet.php
 * Para construir el fichero debemos comentar cada funcion y parámetro que queremos ofrecer en nuestro servidor
 * Para ello debemos usar el formato PHPDocumentor que es muy parecido al de javaDoc.
 * Aquí tenemos una referencia
 * PHPDocumentor es una herramienta de código libre para generación automática de documentación, similar a Javadoc (para el lenguaje Java). Si comentamos el código de nuestras aplicaciones siguiendo unas normas, PHPDocumentor es capaz de generar, a partir de los comentarios que introduzcamos en el código mientras programamos, documentación en diversos formatos (HTML, PDF, XML).
 * Los comentarios se deben ir introduciendo en el código distribuidos en bloques, y utilizando ciertas marcas específicas como @param para indicar un parámetro y @return para indicar el valor devuelto por una función. Por ejemplo, la clase Calcula del ejemplo que nos ocupa nos quedaría:
 * Ahora nos queda generar el fichero wsdl.
 * Para ello en el fichero donde creemos el objeto del servicio ''SoapServer', creamos también un objeto de la clase WSDLDocument e indicamos los siguientes documentos:
 * 1) El nombre de la clase que gestionará las peticiones al servicio.
 * 2) La URL en que se ofrece el servicio.
 * 3) El espacio de nombres destino.
 * El código queda como a continuación se expone:
 * Una vez que ejecutamos, capturamos la salida de la pantalla y la pegamos en un fichero (Crtl-u para ver el código de la página web)
 * Ese es nuestro contenido del fichero wsdl lo copiamos y lo pegamos en un fichero con formato xml
 * En nuestro caso vemos el código que se genera


 * http://www.actionscript.org/forums/showthread.php3?t=70742