Cómo saber cuáles son los procedimientos que tiene un WebService SOAP usando PHP

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.

mchojrin

Por mchojrin

Ayudo a desarrolladores PHP a acceder mercados y clientes más sofisticados y exigentes

3 comentarios

    1. Hola Chaloman!

      Gracias por tu aporte 🙂

      Hay un ejemplo en el post:


      <?php
      $ws = new SoapClient($argv[1]);
      print_r($ws->__getFunctions());

¿Te quedó alguna duda? Publica aca tu pregunta

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.