Saltar la navegación

2.2.- Creación de un servicio web.

Imagen de un esquema de la clase SoapServer, en la que se muestran los métodos que contiene.
DIA (Elaboración propia)
En PHP SOAP, para crear un servicio web, debes utilizar la clase SoapServer. Veamos un ejemplo sencillo. En una carpeta por ejemplo "unidad6" crearemos las carpetas "clienteSoap" y "servidorSoap" (lógicamente puedes usar los nombre que quieras). Dentro de "servidorSoap" crearemos el archivo "servidor.php" con el contenido siguiente:
<?php
class Operaciones
{
    public function resta($a, $b)
    {
        return $a - $b;
    }
    public function suma($a, $b)
    {
        return $a + $b;
    }
    public function saludo($texto)
    {
        return "Hola $texto";
    }
}
$uri='http://localhost/unidad6/servidorSoap';
$parametros=['uri'=>$uri];
try {
    $server = new SoapServer(NULL, $parametros);
    $server->setClass('Operaciones');
    $server->handle();
} catch (SoapFault $f) {
    die("error en server: " . $f->getMessage());
}

El código anterior crea un servicio web con tres funciones: suma, resta y saludo. Cada función recibe unos parámetros y devuelve un valor. Para añadir las funciones de la clase "Operaciones" a nuestro "Servidor Soap" fíjate que hemos añadido "$server->setClass('Operaciones)" . Si hubiésemos implementados las funciones directamente, sin usar una clase, tendríamos que haberlas añadido usando "$server->addFunction('nombre')" para cada función, antes de "$server->handle()". El método handle es el encargado de procesar las peticiones, recogiendo los datos que se reciban utilizando POST por HTTP.

Para consumir este servicio, en la carpeta "clienteSoap" crearemos el fichero "consumir.php" necesitas escribir el siguiente código:

<?php
$url = 'http://localhost/unidad6/servidorSoap/servidor.php';
$uri = 'http://localhost/unidad6/servidorSoap';
$paramSaludo = ['texto' => "Manolo"];
$param = ['a' => 51, 'b' => 29];
try {
    $cliente = new SoapClient(null, ['location' => $url, 'uri' => $uri, 'trace'=>true]);
} catch (SoapFault $ex) {
    echo "Error: ".$ex->getMessage();
}
$saludo = $cliente->__soapCall('saludo', $paramSaludo);
$suma = $cliente->__soapCall('suma', $param);
$resta=$cliente->__soapCall('resta', $param);
echo $saludo. " La suma es: $suma y la resta es: $resta";
//También podríamos hacer
$saludo=$cliente->saludo("Manolo");

El servicio que has creado no incluye un documento WSDL (por eso al crear el servidor hemos puesto "null" como primer parámetro) para describir sus funciones. Sabes que existen los métodos suma, resta y saludo, y los parámetros que debes utilizar con ellos, porque conoces el código interno del servicio. Un usuario que no tuviera esta información, no sabría cómo consumir el servicio.

Fíjate que utilizamos el método mágico "__soapCall()", básicamente le paso el nombre del método que estoy llamando y los parámetros de dicho método en un array. Podíamos haber hecho directamente: "$cliente->suma(4, 5), $cliente->resta(4,5), $cliente->saludo("Nombre")".

Al igual que sucedía con SoapClient al programar un cliente, cuando utilizas SoapServer puedes crear un servicio sin documento WSDL asociado (como en el caso anterior, de nuevo "null" ha sido el primer parámetro), o indicar el documento WSDL correspondiente al servicio; pero antes deberás haberlo creado.

El primer parámetro del constructor indica la ubicación del WSDL correspondiente. El segundo parámetro es una colección de opciones de configuración del servicio. Si existe el primer parámetro, ya no hace falta más información. PHP SOAP utiliza la información del documento WSDL para ejecutar el servicio. Si, como en el ejemplo, no existe WSDL, deberás indicar en el segundo parámetro al menos la opción "uri", con el espacio de nombres destino del servicio.

En ambos casos, y sobre todo cuando estamos en un entorno de desarrollo, es recomendable usar un bloque "try catch()" para capturar posibles excepciones.

Para saber más

El constructor "SoapServer" permite indicar, además de uri, otras opciones en el segundo parámetro. Por ejemplo, la opción soap_version indica si se va a usar SOAP 1.1 o SOAP 1.2.

Constructor SoapServer.

Autoevaluación

Pregunta

Al utilizar la clase SoapServer para crear un servicio web:

Respuestas

Si no creas y le asocias un documento WSDL, deberás indicar las opciones del mismo en la llamada al constructor "SoapServer".

Debes indicar la ubicación del documento WSDL de descripción del servicio.

Retroalimentación