Consumir Servicios Web basados en SOAP es una tarea muy común estos días, especialmente cuando se trata de integrar con entidades gubernamentales (Típico caso es la facturación electrónica).
Una de las características interesantes que tiene este protocolo (SOAP) es que están definidas en forma explícita las operaciones disponibles a través de un archivo de descripción de WebService (WSDL).
La desventaja es que, salvo que conozcas bien la especificación, leer un archivo como este puede ser algo complicado:
<?xml version = "1.0" encoding = "utf-8"?> <definitions name="WS_EmissionFactura" targetNamespace="Gx" xmlns:wsdlns="Gx" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="Gx"> <types> <schema targetNamespace="Gx" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" elementFormDefault="qualified"> <element name="WS_EmissionFactura.Execute"> <complexType> <sequence> <element minOccurs="1" maxOccurs="1" name="Xmlrecepcao" type="xsd:string" /> </sequence> </complexType> </element> <element name="WS_EmissionFactura.ExecuteResponse"> <complexType> <sequence> <element minOccurs="1" maxOccurs="1" name="Xmlretorno" type="xsd:string" /> </sequence> </complexType> </element> </schema> </types> <message name="WS_EmissionFactura.ExecuteSoapIn"> <part name="parameters" element="tns:WS_EmissionFactura.Execute" /> </message> <message name="WS_EmissionFactura.ExecuteSoapOut"> <part name="parameters" element="tns:WS_EmissionFactura.ExecuteResponse" /> </message> <portType name="WS_EmissionFacturaSoapPort"> <operation name="Execute"> <input message="wsdlns:WS_EmissionFactura.ExecuteSoapIn" /> <output message="wsdlns:WS_EmissionFactura.ExecuteSoapOut" /> </operation> </portType> <binding name="WS_EmissionFacturaSoapBinding" type="wsdlns:WS_EmissionFacturaSoapPort"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <operation name="Execute"> <soap:operation soapAction="Gxaction/AWS_EMISSIONFACTURA.Execute" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <service name="WS_EmissionFactura"> <port name="WS_EmissionFacturaSoapPort" binding="wsdlns:WS_EmissionFacturaSoapBinding"> <soap:address location="https://appuypruebas.migrate.info/InvoiCy/aws_emissionfactura.aspx" /> </port> </service> </definitions>
Un modo mucho más simple y conveniente es utilizar un método propio de la clase SoapClient (La que PHP pone a tu disposición para interactuar con esta clase de servicios web): __getFunctions.
Un ejemplo de obtención de listado de funciones provistas por un WebService SOAP
Para este ejemplo se necesita tener instalado el soporte de SOAP para PHP.
Los comandos que te voy a mostrar a continuación pueden ejecutarse sin problemas en Ubuntu (Si usás otro sistema operativo puede que tengas que adaptar un poco los ejemplos).
Asumiré que tenés acceso a una terminal (Si es tu máquina local no debería haber problema, si es un servidor remoto necesitarás algún tipo de acceso como ssh y si tu proveedor no te lo da te sugiero evaluar usar un VPS).
Lo primero será verificar que tengas instalado el soporte para SOAP en la computadora donde vas a correr el script.
Para ello podés usar el comando:
php -i | grep soap
Y la salida debería ser similar a :
/etc/php/7.4/cli/conf.d/20-soap.ini, soap soap.wsdl_cache => 1 => 1 soap.wsdl_cache_dir => /tmp => /tmp soap.wsdl_cache_enabled => 1 => 1 soap.wsdl_cache_limit => 5 => 5 soap.wsdl_cache_ttl => 86400 => 86400
En caso contrario, deberás instalarlo. Este comando te ayudará:
sudo apt install php-soap
Ahora entonces sí, pasemos a ver un poco de PHP 🙂
<?php $ws = new SoapClient($argv[1]); print_r($ws->__getFunctions());
Guardá este código en un archivo llamado get_ws_functions.php
y luego tenés que ejecutarlo de esta forma:
php get_ws_functions.php URL_DEL_WSDL
Por ejemplo, si ejecutás
php get_ws_functions.php "https://appuypruebas.migrate.info/InvoiCy/aws_emissionfactura.aspx?wsdl"
Obtendrás:
Array ( [0] => WS_EmissionFactura.ExecuteResponse Execute(WS_EmissionFactura.Execute $parameters) )
Ahora te toca cambiar la URL por el WebService al que te querés conectar y listo, tenés ahí el listado de métodos que podés invocar.
- Cómo agregar una página de error 500 en un proyecto PHP - 31/10/2024
- ¿Cuántos contenedoresnecesita tu php? - 28/10/2024
- Cuál es el mejor framework PHP para hacer APIs REST - 25/10/2024
Yo creo que el se refería a como invocar el método del webservice.
Creo que faltaría un ejemplo de como invocar la función para cerrar el como se usa.
Hola Chaloman!
Gracias por tu aporte 🙂
Hay un ejemplo en el post:
<?php
$ws = new SoapClient($argv[1]);
print_r($ws->__getFunctions());