Web service con PHP

De WikiSalud
Saltar a: navegación, buscar

Contenido

Web Services con PHP

Servicios WEB

Un servicio web (en inglés, Web services) es una tecnología que utiliza un conjunto de protocolos y estándares que sirven para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet. La interoperabilidad se consigue mediante la adopción de estándares abiertos. Las organizaciones OASIS y W3C son los comités responsables de la arquitectura y reglamentación de los servicios Web. Para mejorar la interoperabilidad entre distintas implementaciones de servicios Web se ha creado el organismo WS-I, encargado de desarrollar diversos perfiles para definir de manera más exhaustiva estos estándares. Es una máquina que atiende las peticiones de los clientes web y les envía los recursos solicitados.

Estándares empleados

  • Web Services Protocol Stack: Así se denomina al conjunto de servicios y protocolos de los servicios Web.
  • XML (Extensible Markup Language): Es el formato estándar para los datos que se vayan a intercambiar.
  • SOAP (Simple Object Access Protocol) o XML-RPC (XML Remote Procedure Call): Protocolos sobre los que se establece el intercambio.
  • Otros protocolos: los datos en XML también pueden enviarse de una aplicación a otra mediante protocolos normales como HTTP (Hypertext Transfer Protocol), FTP (File Transfer Protocol), o SMTP (Simple Mail Transfer Protocol).
  • WSDL (Web Services Description Language): Es el lenguaje de la interfaz pública para los servicios Web. Es una descripción basada en XML de los requisitos funcionales necesarios para establecer una comunicación con los servicios Web.
  • UDDI (Universal Description, Discovery and Integration): Protocolo para publicar la información de los servicios Web. Permite comprobar qué servicios web están disponibles.
  • WS-Security (Web Service Security): Protocolo de seguridad aceptado como estándar por OASIS (Organization for the Advancement of Structured Information Standards). Garantiza la autenticación de los actores y la confidencialidad de los mensajes enviados.

Ventajas de los servicios web

  1. Aportan interoperabilidad entre aplicaciones de software independientemente de sus propiedades o de las plataformas sobre las que se instalen.
  2. Los servicios Web fomentan los estándares y protocolos basados en texto, que hacen más fácil acceder a su contenido y entender su funcionamiento.
  3. Permiten que servicios y software de diferentes compañías ubicadas en diferentes lugares geográficos puedan ser combinados fácilmente para proveer servicios integrados.

Inconvenientes de los servicios Web

  1. Para realizar transacciones no pueden compararse en su grado de desarrollo con los estándares abiertos de computación distribuida como CORBA (Common Object Request Broker Architecture).
  2. Su rendimiento es bajo si se compara con otros modelos de computación distribuida, tales como RMI (Remote Method Invocation), CORBA o DCOM (Distributed Component Object Model). Es uno de los inconvenientes derivados de adoptar un formato basado en texto. Y es que entre los objetivos de XML no se encuentra la concisión ni la eficacia de procesamiento.
  3. Al apoyarse en HTTP, pueden esquivar medidas de seguridad basadas en firewall cuyas reglas tratan de bloquear o auditar la comunicación entre programas a ambos lados de la barrera.

Razones para crear servicios Web

La principal razón para usar servicios Web es que se pueden utilizar con HTTP sobre TCP (Transmission Control Protocol) en el puerto 80. Dado que las organizaciones protegen sus redes mediante firewalls -que filtran y bloquean gran parte del tráfico de Internet-, cierran casi todos los puertos TCP salvo el 80, que es, precisamente, el que usan los navegadores. Los servicios Web utilizan este puerto, por la simple razón de que no resultan bloqueados. Es importante señalar que los servicios web se pueden utilizar sobre cualquier protocolo, sin embargo, TCP es el más común.

Otra razón es que, antes de que existiera SOAP, no había buenas interfaces para acceder a las funcionalidades de otros ordenadores en red. Las que había eran ad hoc y poco conocidas, tales como EDI (Electronic Data Interchange), RPC (Remote Procedure Call), u otras APIs.

Una tercera razón por la que los servicios Web son muy prácticos es que pueden aportar gran independencia entre la aplicación que usa el servicio Web y el propio servicio. De esta forma, los cambios a lo largo del tiempo en uno no deben afectar al otro. Esta flexibilidad será cada vez más importante, dado que la tendencia a construir grandes aplicaciones a partir de componentes distribuidos más pequeños es cada día más utilizada.

Se espera que para los próximos años mejoren la calidad y cantidad de servicios ofrecidos basados en los nuevos estándares.

SOAP

SOAP (siglas de Simple Object Access Protocol) es un protocolo estándar que define cómo dos objetos en diferentes procesos pueden comunicarse por medio de intercambio de datos XML. Este protocolo deriva de un protocolo creado por David Winer en 1998, llamado XML-RPC. SOAP fue creado por Microsoft, IBM y otros y está actualmente bajo el auspicio de la World Wide Web Consortium (W3C). Es uno de los protocolos utilizados en los servicios Web.

Características

SOAP puede formar la capa base de una "pila de protocolo de web service", ofreciendo un framework de mensajería básica en la cual los web services se puedan construir. Este protocolo basado en XML consiste de tres partes: un sobre (envelope), el cual define qué hay en el mensaje y cómo procesarlo; un conjunto de reglas de codificación para expresar instancias de tipos de datos; y una conversión para representar llamadas a procedimientos y respuestas. El protocolo SOAP tiene tres caracteristicas principales:

  • Extensibilidad (seguridad y WS-routing son extensiones aplicadas en el desarrollo).
  • Neutralidad (SOAP puede ser utilizado sobre cualquier protocolo de transporte como HTTP, SMTP, TCP o JMS).
  • Independencia (SOAP permite cualquier modelo de programación).

Como ejemplo de cómo los procedimientos SOAP pueden ser utilizados, un mensaje SOAP podría ser enviado a un sitio Web que tiene habilitado Web service, para realizar la búsqueda de algún precio en una base de datos, indicando los parámetros necesitados en la consulta. El sitio podría retornar un documento formateado en XML con el resultado, ejemplo, precios, localización, características. Teniendo los datos de respuesta en un formato estandarizado "parseable", este puede ser integrado directamente en un sitio Web o aplicación externa.

La arquitectura SOAP consiste de muchas capas de especificación: para el formato del mensaje, MEP (Message Exchange Patterns), subyacentes enlaces de protocolo de transporte, modelo de procesamiento de mensajes, y extensibilidad del protocolo. SOAP es el sucesor de XML-RPC, a pesar de que toma el transporte y la neutralidad de la interacción y el envelope / header / body de otra parte (probablemente de WDDX).

WSDL

WSDL (en ocasiones leído como como wisdel) son las siglas de Web Services Description Language, un formato XML que se utiliza para describir servicios Web . La versión 1.0 fue la primera recomendación por parte del W3C y la versión 1.1 no alcanzó nunca tal estatus. La versión 2.0 se convirtió en la recomendación actual por parte de dicha entidad.

WSDL describe la interfaz pública a los servicios Web. Está basado en XML y describe la forma de comunicación, es decir, los requisitos del protocolo y los formatos de los mensajes necesarios para interactuar con los servicios listados en su catálogo. Las operaciones y mensajes que soporta se describen en abstracto y se ligan después al protocolo concreto de red y al formato del mensaje.

Así, WSDL se usa a menudo en combinación con SOAP y XML Schema. Un programa cliente que se conecta a un servicio web puede leer el WSDL para determinar qué funciones están disponibles en el servidor. Los tipos de datos especiales se incluyen en el archivo WSDL en forma de XML Schema. El cliente puede usar SOAP para hacer la llamada a una de las funciones listadas en el WSDL.

El WSDL nos permite tener una descripción de un servicio web. Especifica la interfaz abstracta a través de la cual un cliente puede acceder al servicio y los detalles de cómo se debe utilizar.

Estructura del WSDL

Como vemos, la estructura del WSDL tiene los siguientes elementos:

Tipos de Datos

<types>: Esta sección define los tipos de datos usados en los mensajes. Se utilizan los tipos definidos en la especificación de esquemas XML.

Mensajes <message>: Aquí definimos los elementos de mensaje. Cada mensaje puede consistir en una serie de partes lógicas. Las partes pueden ser de cualquiera de los tipos definidos en la sección anterior.

Tipos de Puerto <portType>: Con este apartado definimos las operaciones permitidas y los mensajes intercambiados en el Servicio.

Bindings <binding>: Especificamos los protocolos de comunicación usados.

Servicios <service>: Conjunto de puertos y dirección de los mismos. Esta parte final hace referencia a lo aportado por las secciones anteriores. Con estos elementos no sabemos qué hace un servicio pero sí disponemos de la información necesaria para interactuar con él (funciones, mensajes de entrada/salida, protocolos...).

Ejemplo

A continuación se muestra un ejemplo de un documento WSDL y sus diferentes secciones. En este ejemplo concreto se implementa un servicio que muestra a partir del nombre de un valor bursátil su valor actual en el mercado.

<definitions xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:saludwsdl1" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="urn:saludwsdl1">
  <types>
      <xsd:schema targetNamespace="urn:saludwsdl1">
	<xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/>
	<xsd:import namespace="http://schemas.xmlsoap.org/wsdl/"/>
	  <xsd:complexType name="Parametros">
	    <xsd:all>
	      <xsd:element name="codigo" type="xsd:string"/>
	      <xsd:element name="usuario" type="xsd:string"/>
	      <xsd:element name="clave" type="xsd:string"/>
	    </xsd:all>
	  </xsd:complexType>
	  <xsd:complexType name="Permiso">
	    <xsd:all>
	      <xsd:element name="institucion" type="xsd:string"/>
	      <xsd:element name="no_permiso" type="xsd:string"/>
	      <xsd:element name="nombre_importador" type="xsd:string"/>
	      <xsd:element name="dui_importador" type="xsd:string"/>
	      <xsd:element name="nit_importador" type="xsd:string"/>
	      <xsd:element name="fecha_emision_permiso" type="xsd:string"/>
	      <xsd:element name="fecha_vencimiento_permiso" type="xsd:string"/>
	    </xsd:all>
	  </xsd:complexType>
	  <xsd:complexType name="Sustancia">
	    <xsd:all>
	      <xsd:element name="correlativo" type="xsd:string"/>
	      <xsd:element name="nombre_sustancia" type="xsd:string"/>
	      <xsd:element name="cantidad_autorizada" type="xsd:string"/>
	      <xsd:element name="unidad" type="xsd:string"/>
	    </xsd:all>
	</xsd:complexType>
	<xsd:complexType name="Sustancias">
	  <xsd:complexContent>
	    <xsd:restriction base="SOAP-ENC:Array">
	      <xsd:attribute ref="SOAP-ENC:arrayType" wsdl:arrayType="tns:Sustancia[]"/>
	      </xsd:restriction>
	    </xsd:complexContent>
	  </xsd:complexType>
      </xsd:schema>
  </types>
  <message name="getDatosPermisoRequest">
    <part name="Parametros" type="tns:Parametros"/>
  </message>
  <message name="getDatosPermisoResponse">
    <part name="Permiso" type="tns:Permiso"/>
    <part name="Sustancias" type="tns:Sustancias"/>
    <part name="mensaje" type="xsd:string"/>
  </message>
  <portType name="saludwsdl1PortType">
    <operation name="getDatosPermiso">
      <documentation>Consultar permiso</documentation>
      <input message="tns:getDatosPermisoRequest"/>
      <output message="tns:getDatosPermisoResponse"/>
    </operation>
  </portType>
  <binding name="saludwsdl1Binding" type="tns:saludwsdl1PortType">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getDatosPermiso">
      <soap:operation soapAction="urn:saludwsdl#getDatosPermiso" style="rpc"/>
      <input>
	<soap:body use="encoded" namespace="urn:saludwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
	<soap:body use="encoded" namespace="urn:saludwsdl" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>
  <service name="saludwsdl1">
    <port name="saludwsdl1Port" binding="tns:saludwsdl1Binding">
      <soap:address location="http://localhost/permisos/saludwsdl1.php"/>
    </port>
  </service>
</definitions>


Ejemplo

A partir de la versión de PHP5 se incorporan las clases necesarias para la creación de webservices y su invocación desde clientes remotos, a continuación se muestra como crear un servicio Web en PHP5 que ejecute un método dentro de una clase definida por el usuario en el servidor.

Implementar la Clase a Utilizar :

Ir al directorio web donde se quiere crear el servicio. Implemente la clase y sus métodos. (utilizaremos una clase para sumar y restar) Crear el archivo metodo.php

<?php
 
        // Clase que implementa los servicios
        class Calculadora
        {
                // Metodo a utilizar como servicio
                public function sumar($x, $y)
                {
                        return $x + $y;
                }
		public function restar($x, $y)
                {
                        return $x - $y;
                }
 
}
?>

Implementar el Servicio Web :

Utilizando su editor favorito crear un archivo donde se cree el servidor

Crear el archivo servicio.php Incluir la clase saludo a utilizar dentro del webservice No se utilizara WSDL ya que toca generarlo a mano para el servicio Al no utilizar WSDL se debe suministrar el namespace, en este caso uri:webservices Al momento de asignar la clase al webservice se debe suministrar el nombre.

<?php
        // Incluir la Clase 
        require_once('metodo.php');
 
        // Crear servidor de Soap
        $server = new SoapServer(
                null, // No utilizar WSDL
                array('uri' => 'urn:webservices') // Se debe especificar el URI
        );
 
        // Asignar la Clase
        $server->setClass('Calculadora');
 
        // Atender los llamados al webservice
        $server->handle();
?>

Abrir la página PHP en su navegador favorito, debe salir en blanco sin reportar errores http://<servidor>/<ruta>/servicio.php Implementar el Cliente : En este caso implementaremos un cliente en el lenguaje PHP para consumir el servicio. Utilizando su editor favorito crear un archivo cliente.php

 
<?php
        // Crear el cliente suministrado la ruta del servicio
        // Utilizar el uri
        $client = new SoapClient(null,
                array(
                        'location' => 'http://192.168.10.221/wsdlphp5/servicio.php',
                        'uri' => 'urn:webservices',
                ));
 
        // Llamar el metodo como si fuera del cliente
        echo "El resultado de la suma es : ".$client->sumar(3,3). '<br>';
 
	echo "El resultado de la resta es : ".$client->restar(3,3);
 
 
 
?>

Abrir la pagina PHP del cliente en su navegador favorito, debe salir en blanco sin reportar errores http://<servidor>/<ruta>/cliente.php

Herramientas personales
Espacios de nombres

Variantes
Acciones
Navegación
Herramientas