Este documento describe cómo obtener e instalar NuSOAP y luego proporciona algunos ejemplos para ilustrar las funciones de NuSOAP. Esta no es una introducción completa a NuSOAP, pero es de esperar que algunos desarrolladores de PHP puedan tener una buena introducción.
NuSOAP es un conjunto de clases PHP que permiten a los desarrolladores crear y utilizar servicios web SOAP. No requiere la instalación de ninguna extensión PHP. Fue desarrollado el 3 de diciembre de 2004 y la versión actual es NuSOAP (0.6.7). Al admitir la especificación SOAP 1.1, puede producir y utilizar WSDL 1.1, y también admite servicios rpc/codificados y de documentos/literales. Sin embargo, es importante tener en cuenta que NuSOAP no proporciona una implementación completa como .NET y Apache Axis.
Hola Mundo
Comenzaré con el ejemplo "Hola mundo" y escribiré código básico de cliente y servidor NuSOAP.
Comencemos primero con el lado del servidor, porque sin el lado del servidor, no tiene sentido tener el lado del cliente. Vamos a escribir un método SOAP llamado Hello que toma un único parámetro y devuelve una cadena y, con suerte, los comentarios en el código proporcionarán instrucciones útiles.
<?php
// Introduce el código NuSOAP
require_once('nusoap.php');
// Crea la instancia del servidor
$servidor = nuevo servidor_soap;
//Registra el método a exponer
$servidor->registro('hola');
// Definir el método como una función PHP
función hola($nombre) {
devolver 'Hola,' $nombre;
}
// Usa la solicitud para (intentar) invocar el servicio
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ?
$servidor->servicio($HTTP_RAW_POST_DATA);
?>
El siguiente es el código del cliente. Hay algunas cosas importantes a tener en cuenta: Primero, al crear la instancia SOAPclient, debe especificar una URL de servicio como parámetro. En este ejemplo, se accede a helloworld.php desde http://. localhost/phphack de. Por supuesto, los servicios que desea utilizar se colocan en diferentes URL; en segundo lugar, al llamar al servicio, el primer parámetro es el nombre del servicio, que debe coincidir con un nombre de método válido (algunos servidores distinguen entre mayúsculas y minúsculas). En este ejemplo, debe coincidir con el método ya registrado en helloworld.php. Finalmente, el segundo parámetro es una matriz que se pasará al método del servicio SOAP como parámetro. Dado que el método hello en helloworld.php tiene solo un parámetro, la matriz tiene solo un elemento.
<?php
// Introduce el código NuSOAP
require_once('nusoap.php');
// Crea la instancia del cliente
$cliente = nuevo cliente de jabón('http://localhost/phphack/helloworld.php');
// Llama al método SOAP
$resultado = $cliente->call('hola', array('nombre' => 'Scott'));
// Mostrar el resultado
print_r($resultado);
?>
Depuración
Al programar, es necesario depurar cada vez que algo sale mal. NuSOAP proporciona un conjunto de herramientas para ayudarle a hacer esto. La información que necesita verificar al depurar NuSOAP es la información de solicitud enviada y la información correspondiente devuelta. La clase de cliente de NuSOAP le permite ver esta información a través de sus dos miembros. Por ejemplo, aquí hay una versión modificada de helloworldclient.php que muestra la solicitud y la respuesta. En la siguiente sección revisaré la información de solicitud y respuesta que se muestra en el código del cliente.
<?php
// Introduce el código NuSOAP
require_once('nusoap.php');
// Crea la instancia del cliente
$cliente = nuevo cliente de jabón('http://localhost/phphack/helloworld.php');
// Llama al método SOAP
$resultado = $cliente->call('hola', array('nombre' => 'Scott'));
// Mostrar el resultado
print_r($resultado);
// Mostrar la solicitud y la respuesta
echo '<h2>Solicitud</h2>';
echo '<pre>' .htmlspecialchars($cliente->solicitud, ENT_QUOTES) '</pre>';
echo '<h2>Respuesta</h2>';
echo '<pre>' .htmlspecialchars($cliente->respuesta, ENT_QUOTES) '</pre>';
?>
NuSOAP también proporciona un método para ver información de depuración a través de registros utilizando sus clases. Agregar el siguiente código mostrará información de depuración extensa. Desafortunadamente, la descripción del resultado debe dejarse en manos del lector.
// Mostrar los mensajes de depuración
echo '<h2>Depurar</h2>';
echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';
El servidor puede proporcionar información de depuración similar. Curiosamente, esta información de depuración está en xml al final del formato SOAP. se muestra para que pueda verse en el cliente. La depuración del lado del servidor tiene este aspecto:
<?php
// Introduce el código NuSOAP
require_once('nusoap.php');
// Habilitar la depuración *antes* de crear la instancia del servidor
$depuración = 1;
// Crea la instancia del servidor
$servidor = nuevo servidor_soap;
//Registra el método a exponer
$servidor->registro('hola');
// Definir el método como una función PHP
función hola($nombre) {
devolver 'Hola,' $nombre;
}
// Usa la solicitud para (intentar) invocar el servicio
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ?
$servidor->servicio($HTTP_RAW_POST_DATA);
?>
El tercer método de depuración no es realmente depuración, es una buena práctica de programación. El ejemplo anterior no realiza verificación de errores al llamar a SOAP. Un cliente más robusto se vería así:
<?php.
// Introduce el código NuSOAP
require_once('nusoap.php');
// Crea la instancia del cliente
$cliente = nuevo cliente de jabón('http://localhost/phphack/helloworld.php');
// Comprobar si hay un error
$err = $cliente->getError();
si ($err) {
// Mostrar el error
echo '<p><b>Error del constructor: ' $err '</b></p>';
// En este punto, sabes que la llamada siguiente fallará
}
// Llama al método SOAP
$resultado = $cliente->call('hola', array('nombre' => 'Scott'));
//Comprueba si hay algún fallo
si ($cliente->fallo) {
echo '<p><b>Error: ';
print_r($resultado);
eco '</b></p>';
} demás {
// Comprobar errores
$err = $cliente->getError();
si ($err) {
// Mostrar el error
echo '<p><b>Error: ' $err '</b></p>';
} demás {
// Mostrar el resultado
print_r($resultado);
}
}
?>
Para probar el código, debe provocar que se produzca un error, por ejemplo, cambiar el nombre del método llamado hola por adiós.
Solicitud y respuesta
En el ejemplo anterior he mostrado lo fácil que es mostrar información de solicitud y respuesta de SOAP. Aquí está la información de solicitud para hello2client.php:
POST /phphack/helloworld2.php HTTP/1.0
Anfitrión: servidor local
Agente de usuario: NuSOAP/0.6.8 (1.81)
Tipo de contenido: texto/xml; conjunto de caracteres=ISO-8859-1
SOAPAcción: ""
Longitud del contenido: 538
<?xml versión="1.0" codificación="ISO-8859-1"?>
<SOAP-ENV:Sobre
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
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:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Cuerpo>
<ns1:hola xmlns:ns1=" http://testuri.org ">
<nombre xsi:type="xsd:string">Scott</nombre>
</ns1:hola>
</SOAP-ENV:Cuerpo>
</SOAP-ENV:Sobre>
En los encabezados HTTP, verá que SOAPAction es una cadena vacía, que es su valor predeterminado. Su método de servicio puede establecer el valor de SOAPAction y su código de cliente puede llamar al método especificando SOAPAction como parámetro.
En la carga útil XML, puede ver que NuSOAP utiliza la conocida codificación ISO-8859-1 como Latin-1. Para especificar una codificación diferente, puede configurar el atributo SOAP_defencoding en la instancia del cliente SOAP. Por supuesto, es responsabilidad del programador codificar los datos de los parámetros utilizando la codificación especificada. Afortunadamente, PHP proporciona muchas funciones para codificar y decodificar los datos de codificación más comunes en SOAP, como UTF-8.
Otra cosa a tener en cuenta es que el elemento especifica el método que se llamará. El elemento llamado hola se coloca bajo el nombre de dominio http://tempuri.org . Especificar el nombre de dominio real es una buena práctica y también es muy común para muchos servicios. Es necesario. Aquí se muestra un documento futuro:
El servicio SOAP responde así:
HTTP/1.1 200 OK
Servidor: Microsoft-IIS/5.0
Fecha: miércoles, 3 de noviembre de 2004 21:32:34 GMT
X-Desarrollado por: ASP.NET
X-Desarrollado por: PHP/4.3.4
Servidor: Servidor NuSOAP v0.6.8
Servidor X-SOAP: NuSOAP/0.6.8 (1.81)
Tipo de contenido: texto/xml; conjunto de caracteres=ISO-8859-1
Longitud del contenido: 556
<?xml versión="1.0" codificación="ISO-8859-1"?>
<SOAP-ENV:Sobre
SOAP-ENV:encodingStyle=" http://schemas.xmlsoap.org/soap/encoding/ "
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:si=" http://soapinterop.org/xsd ">
<SOAP-ENV:Cuerpo>
<ns1:holaRespuesta xmlns:ns1=" http://tempuri.org ">
<return xsi:type="xsd:string">Hola, Scott</return>
</holaRespuesta>
</SOAP-ENV:Cuerpo>
</SOAP-ENV:Sobre>