10. Creación de servidor de datos y cliente para conexión mediante SOAP

Se explica aquí cómo usar el protocolo de aplicaciones de objeto simple (SOAP) en php, usando XML para intercambio de datos. Para ello se usará una librería llamada nusoap que se puede descargar de este servidor. Esta librería permite la conversión automática de documentos XML mediante el lenguaje WSDL.También haremos uso de la función sqlToXml para pasar consultas sql a XML.

Paso 1. Creación del servidor o proveedor de los datos mediante soap

En un servidor web se creará un servidor SOAP o proveedor de datos en lenguaje WSDL (formato XML), usando nusoap desde un script php. Este servidor ofrecerá distintos servicios, los cuales serán registrados en el mismo script. Por ejemplo, se va a crear un servidor con un sólo servicio: getSamples, que devolverá la lista de ejemplares en la base de datos Biblioteca para un año concreto. Se devolverá en format XML para el intercambio de datos.

Función sqlToXml

function sqlToXml($queryResult, $rootElementName, $childElementName)
{
$xmlData = "\n";
$xmlData .= "<" . $rootElementName . ">";

while($record = mysql_fetch_object($queryResult))
{
/* Create the first child element */
$xmlData .= "<" . $childElementName . ">";

for ($i = 0; $i < mysql_num_fields($queryResult); $i++)
{
$fieldName = mysql_field_name($queryResult, $i);

/* The child will take the name of the table column */
$xmlData .= "<" . $fieldName . ">";

/* We set empty columns with NULL, or you could set
it to '0' or a blank. */
if(!empty($record->$fieldName))
$xmlData .= $record->$fieldName;
else
$xmlData .= "null";

$xmlData .= "";
}
$xmlData .= "";
}
$xmlData .= "";
return $xmlData;
}

?>

Ejemplo

Un ejemplo de servidor SOAP:

require_once "nusoap.php";

function getSamples($year) {
$user="TISD";
$password="*******";
$db=mysql_connect("localhost",$user,$password) or die("Error en la conexión a MySql");
$sql=utf8_decode("SELECT *.`codigo_libro`, *.`codigo_ejemplar` FROM `vista:Completa` WHERE `year`='$year'");
$result=mysql_db_query("TISD",$sql,$db);
mysql_close();
if ($result)
{
return sqlToXml($result, "samples", "sample");
}
else {
return "No hay ejemplares de este año";
}
}

$server = new soap_server();
$server->configureWSDL("sample", "urn:sample");

$server->register("getSamples",
array("year" => "xsd:string"),
array("return" => "xsd:string"),
"urn:sample",
"urn:sample#getSample",
"rpc",
"encoded",
"Nos da una lista de ejemplares en este año");

$server->service(file_get_contents('php://input'));
?>

Paso 2. Creación de una página web (puede estar en otro servidor) en php que será cliente del servidor SOAP anterior

Por ejemplo, se va a crear una página que muestre la lista de ejemplares del servicio getSamples ofrecido por el anterior servidor SOAP.

Ejemplo

Un ejemplo de cliente SOAP

require_once "nusoap/lib/nusoap.php";
$cliente = new nusoap_client("http://bios.ugr.es/TISD/TutorialPHP/SOAP/sample.php");
//$cliente= new nusoap_client ("samples.wsdl", true);
$error = $cliente->getError();
if ($error) {
echo "Constructor error" . $error;
}
$result = $cliente->call("getSamples", array("year" => "activo"));
if ($cliente->fault) {
echo "Fault";
print_r($result);
}
else {
$error = $cliente->getError();
if ($error) {
echo "Error". $error;
}
else {
echo "Samples";
echo $result;
}
}
?> ~