Está en la página 1de 3

CREAR UN WEBSERVICE BÁSICO CON PHP Y SOAP

SOAP es un protocolo de intercambio para servicios web basado en XML Para facilitarnos la vida empezaremos por
descargar NuSOAP, que nos proveerá de diversas clases para trabajar con este protocolo.
Ok, con NuSOAP instalado toca crear un servidor SOAP en nuestra aplicación. Para el ejemplo crearemos un servidor, lo
llamaremos producto.php, que si recibe una petición donde se le pida una lista de libros devuelva tres títulos (es un ejemplo
básico, piensa que en la realiad podrías acceder a una base de datos y dar muchas más funcionalidades).

<?php
require_once "nusoap.php";

function getProd($categoria) {
if ($categoria == "libros") {
return join(",", array(
"El señor de los anillos",
"Los límites de la Fundación",
"The Rails Way"));
}
else {
return "No hay productos de esta categoria";
}
}

$server = new soap_server();


$server->register("getProd");
$server->service($HTTP_RAW_POST_DATA);
?>

Ok, ahora necesitas un cliente, que llamaremos cliente.php. En el constructor, el cliente recibirá el url del servidor y para
acceder al método que nos devuelve los libros recurriremos al método call(), al cual le pasaremos el nombre del método del
servidor al que queremos acceder y los parámetros en forma de array. Además, también controlaremos que no haya errores
en la comunicación.
<?php
require_once "nusoap.php";
$cliente = new nusoap_client("http://localhost/producto.php");

$error = $cliente->getError();
if ($error) {
echo "<h2>Constructor error</h2><pre>" . $error . "</pre>";
}
$result = $cliente->call("getProd", array("categoria" => "libros"));

if ($cliente->fault) {
echo "<h2>Fault</h2><pre>";
print_r($result); echo
"</pre>";
}
else {
$error = $cliente->getError();
if ($error) {
echo "<h2>Error</h2><pre>" . $error . "</pre>";
}
else {
echo "<h2>Libros</h2><pre>";
echo $result; echo "</pre>";
}
}
?>

Con esto ya tienes una idea múy básica del funcionamiento de un webservice SOAP construído con PHP. Pero claro,
nos falta un archivo WSDL para tener un webservice decente. Aunque dicho archivo puede ser escrito a mano, NuSOAP
puede generarlo por ti pasándole ciertos parámetros, por lo que lo ideal sería generarlo en el servidor. Así que modifica
tu producto.php para que quede tal que así:
<?php
require_once "nusoap.php";

function getProd($categoria) {
if ($categoria == "libros") {
return join(",", array(
"El señor de los anillos",
"Los límites de la Fundación",
"The Rails Way"));
}
else {
return "No hay productos de esta categoria";
}
}

$server = new soap_server();


$server->configureWSDL("producto", "urn:producto");

$server->register("getProd",
array("categoria" => "xsd:string"),
array("return" => "xsd:string"),
"urn:producto",
"urn:producto#getProd",
"rpc",
"encoded",
"Nos da una lista de productos de cada categoría");

$server->service($HTTP_RAW_POST_DATA);
?>
Como ves, el cambio en es cuando llamamos a register, ya que en vez de pasarle, como antes, el método en cuestión, le
añadimos también varios argumentos para generar el WSDL:El primer array nos permite definir el argumento de entrada
y su tipo de datos

El segundo define la función de retorno y su tipo de datos


urn:producto es la definición del namespace
urn:producto#getProd es donde definimos la acción SOAP
Luego viene el tipo de llamada,que puede ser rpc, como en el ejemplo, odocument
Tras esto definimos el valor del atribute use, que puede ser encodedo literal
Finalmente viene una descripción de qué hace el método al que llamamos
Ahora basta con que en el navegador accedas a producto.php?wsdl y verás el WSDL generado. Ya puedes copiarlo y añadirlo a
tu directorio web (crea un archivo y llámalo, por ejemplo, libros.wsdl).
Para que el cliente lo utilice debes modificar el código, y en el constructor, en vez del url le pasas el nombre del archivo, de
forma que quede como en el ejemplo:
1 $client = new nusoap_client("libros.wsdl", true);
Ahora sí, ya tienes montado un pequeño servicio web. El ejemplo es simplón, pero piensa en todas las funcionalidades que
podrías incorporarle.

También podría gustarte