Crear archivo WSDL en PHP

Sin embargo, antes de pasar al cliente, echemos un vistazo rápido a WSDL. La etiqueta @soap utilizada en los métodos de la clase ServiceProxy no tiene nada que ver con el funcionamiento de SoapServer como lo es ahora.

Lo usamos simplemente debido a la biblioteca php2wsdl que nos permite generar automáticamente un archivo WSDL basado en la clase provista. La biblioteca php2wsdl se proporciona como un paquete de composer, lo que significa que podemos instalarla simplemente ejecutando el siguiente comando dentro del directorio dsoap-service/server:

composer require php2wsdl/php2wsdl

Una vez instalado, podemos crear el archivo soap-service\server\wsdl-auto-gen.php con el siguiente contenido:

<?php
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/ServiceProxy.php';
$class = 'ServiceProxy';
$serviceURI = 'http://soap-service.server/index.php';
$wsdlGenerator = new PHP2WSDL\PHPClass2WSDL($class, $serviceURI);
$wsdlGenerator->generateWSDL(true);
file_put_contents(__DIR__ . '/wsdl.xml', $wsdlGenerator->dump());

Una vez que ejecutemos wsdl-auto-gen.php, ya sea en la consola o en el navegador, generará el archivo soap-service/server/wsdl.xml con el siguiente contenido:

<?xml version="1.0"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://soap-service.server/index.php" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="ServiceProxy" targetNamespace="http://soap-service.server/index.php"> <types> <xsd:schema targetNamespace="http://soap-service.server/index.php"> <xsd:import namespace="http://schemas.xmlsoap.org/soap/encoding/"/> </xsd:schema> </types> <portType name="ServiceProxyPort"> <operation name="customerWelcome"> <documentation>Says "Welcome customer..."</documentation> <input message="tns:customerWelcomeIn"/> <output message="tns:customerWelcomeOut"/> </operation> <operation name="userWelcome"> <documentation>Says "Welcome user..."</documentation> <input message="tns:userWelcomeIn"/> <output message="tns:userWelcomeOut"/> </operation> </portType> <binding name="ServiceProxyBinding" type="tns:ServiceProxyPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="customerWelcome">gt; <soap:operation soapAction="http://soap-service.server/index.php#customerWelcome"/> <input> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap-service.server/index.php"/> </input> <output> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap-service.server/index.php"/> </output> </operation> <operation name="userWelcome"> <soap:operation soapAction="http://soap-service.server/index.php#userWelcome"/> <input> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap-service.server/index.php"/> </input> <output> <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://soap-service.server/index.php"/> </output> </operation> </binding> <service name="ServiceProxyService"> <port name="ServiceProxyPort" binding="tns:ServiceProxyBinding"> <soap:address location="http://soap-service.server/index.php"/> </port> </service> <message name="customerWelcomeIn"> <part name="name" type="xsd:anyType"/> </message> <message name="customerWelcomeOut"> <part name="return" type="xsd:string"/> </message> <message name="userWelcomeIn"> <part name="name" type="xsd:anyType"/> </message> <message name="userWelcomeOut"> <part name="return" type="xsd:string"/> </message> </definitions>

Este es un archivo bastante largo para escribir manualmente. El beneficio de esto es que varias herramientas de terceros y otras bibliotecas de idiomas pueden consumir fácilmente nuestro servicio una vez que configuramos el archivo WSDL. Como ejemplo, esta es una captura de pantalla de la extensión Wizdler para el navegador Chrome, interpretando el contenido del archivo WSDL:

Con WSDL en su lugar, ahora podemos modificar fácilmente el archivo soap-service/server/index.php de la siguiente manera:

// NON-WSDL MODE: $server = new SoapServer(null, $options);
// WSDL MODE: $server = new
SoapServer('http://soap-service.server/wsdl.xml');
$server = new SoapServer('http://soap-service.server/wsdl.xml');

Ahora que tenemos los bits del servidor SOAP ordenados, creemos un cliente.

Comparte