Envio y Recepción de Arrays Basicos via SOAP con PHP5
Como sabrán estoy escribiendo la lista de capítulos sobre el desarrollo de servicios web en PHP5 , para poder entender este POST, es necesario al menos saber las cosas básicas de los web services , lo podrán entender en el siguiente post.
Ahora es el momento de enviar arrays por nuestro servicio web, y ya entramos a un nivel un poco más tedioso por que tenemos que cuidar el tipo de variable SOAP que enviamos y crear algunos objetos via SOAP que soporte un array.
Para el presente ejemplo veremos como enviar un array a la vez de como recibirlo :
Se que este Post será ayuda, asi que una forma de retribuir esa ayuda, es visitando los Sitios Recomendados que aparecen a la izquierda del post o la publicidad ya que ellos proveen información relacionada al post presente y darán mayor presencia al Blog de su servidor…
Además pueden recomendar este Blog en delicius o cualquier otra red social que encuentre, tambien seria bueno que compartan sus experiencias a través de sus comentarios.
Seguimos:
Como ustedes sabrán es necesario tener, su SCRIPT que hará el papel de servidor, su archivo WSDL que declare todos los tipos de datos y su cliente, que puede estar en cualquier computadora en la red, no importa, si entiende SOAP pues no habrá ningún problema para ejecutar el siguiente ejemplo:
Primero declaramos el script servidor, el cual lo llamaremos
serverbasic_array.php
<?php
//** CREAMOS LA FUNCION ***//
function duplicar($params){
//$params --> Es un objeto que es enviado que contiene los par?metros via WSDL
//Accedemos a los parametros de la siguiente forma:
$array_input = $params->array_input;
$array_output = array();
//Hacemos un recorrido por el array
for($i = 0; $i< count($array_input) ; $i++ ){
//Duplicamos el valor del array de entrada
$entero = $array_input[$i] * 2;
//Lo adjuntamos al array de salida
array_push($array_output,$entero);
}//fin del foreach
//Creamos el array de saida del tipo SOAP_ARRAY
$array_output = new SoapVar(
array( 'array_output'=>$array_output
) ,SOAP_ENC_OBJECT ,"int", "urn:BasicAPI"
);
//Y por ultimo devolvemos el array de salida
return $array_output;
}//function
ini_set("soap.wsdl_cache_enabled", "0");
//Creamos el objeto Servidor, indicando a que archivo WSDL apunta, ya que ah? a sido declarada su operacion y la URN del WSDL, tamb?en la versi?n de SOAP que se utiliza.
$sServer = new SoapServer('basic_array.wsdl', array('actor'=>'urn:BasicAPI', 'soap_version' => SOAP_1_2));
//Se declara la funci?n
$sServer->addFunction("duplicar");
$sServer->handle();
?>
Luego declaramos el script WSDL que no es más que un archivo XML donde declaramos todos los objetos que tenemos, el cual lo llamaremos
basic_array.wsdl
<?xml version="1.0"?> <!-- DECLARAMOS LOS XMLNS Y LOS URN --> <definitions targetNamespace="urn:BasicAPI" xmlns:tns="urn:BasicAPI" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:BasicAPI"> <!-- CREAMOS EL OBJETO ARRAY DE TIPO ENTERO --> <xsd:complexType name="ArrayOfInt"> <xsd:complexContent> <xsd:restriction base="soapenc:Array"> <!-- AQUI DECLARAMOS EL TIPO DE DATO DEL ARRAY --> <xsd:attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:int[]"/> </xsd:restriction> </xsd:complexContent> </xsd:complexType> <!-- DECLARAMOS LOS LOS PAR?METROS DE NUESTRA FUNCI?N --> <xsd:complexType name="duplicarParams"> <xsd:all> <!-- INDICAMOS EL NOMBRE DEL ELEMENTO Y SU TIPO DE DATO --> <xsd:element name="array_input" type="tns:ArrayOfInt" /> </xsd:all> </xsd:complexType> <xsd:complexType name="duplicarResponse"> <xsd:all> <!-- INDICAMOS EL NOMBRE DEL ELEMENTO Y SU TIPO DE DATO --> <xsd:element name="array_output" type="tns:ArrayOfInt" /> </xsd:all> </xsd:complexType> <!-- CREAMOS LOS ELEMENTOS RESPUESTA Y PETICION --> <xsd:element name="duplicarRequest" type="tns:duplicarParams"/> <xsd:element name="duplicarResponse" type="tns:duplicarResponse"/> <!-- INDICAMOS QUE LA RESPUESTA ES UN ENTERO --> </xsd:schema> </types> <!-- DECLARAMOS LOS MENSAJES QUE FORMARAN LA OPERACION --> <!-- , Es necesario seguir el patron Request Response por asuntos de orden --> <!-- Ya que un WSDL puede llegar a tener decenas de operaciones --> <message name="duplicar"> <part name="duplicar" element="tns:duplicarRequest"/> </message> <message name="duplicarResponse"> <part name="result" element="tns:duplicarResponse"/> </message> <!-- CREAMOS EL PUETO DE SERVICIO DE LA OPERACION --> <!-- INDICAMOS CUAL ES LA ENTRADA Y LA SALIDA --> <portType name="ServicePortType"> <operation name="duplicar"> <input message="tns:duplicar"/> <output message="tns:duplicarResponse"/> </operation> </portType> <!-- CREAMOS EL BINDING DE LA OPERACION --> <binding name="ServiceBinding1" type="tns:ServicePortType"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> <operation name="duplicar"> <soap:operation soapAction="duplicar"/> <input> <soap:body use="literal"/> </input> <output> <soap:body use="literal"/> </output> <fault name="AccessFault"> <soap:fault name="AccessFault" use="literal"/> </fault> </operation> </binding> <!-- POR ULTIMO DECLARAMOS EL SERVICIO --> <service name="Service"> <port name="Port1" binding="tns:ServiceBinding1"> <!-- INDICAMOS DONDE SE UBICA NUESTRO SCRIPT EN PHP --> <soap:address location="http://localhost/soapserver/serverbasic_array.php"/> </port> </service> </definitions>
Por ultimo creamos nuestra aplicación cliente, el cual se llamará clientbasic_array
clientbasic_array.php
<?php
//PARA LLAMAR A UN SERVICIO WEB DEBEMOS DE PONERLO EN UN BLOQYE TRY CATCH,
//UN SERVICIO WEB ES MUY PROCLIBE A CAER EN ERRORES Y LOS BLOQUES TRY CATCH,
//NOS AYUDARAN A DEPURARLOS
try {
//INDICAMOS DONDE ESTA EL WSDL QUE VAMOS A CONSULTAR Y CREAMOS EL OBJETO CLIENT
$sClient = new SoapClient('http://localhost/soapserver/basic_array.wsdl');
//CREAMOS EL OBJETO REQUEST DONDE DECLARAMOS EL ARRAY QUE CONTIENE NUESTROS
//PARAMETROS A Y B QUE ESTAN DECLARADOS EN EL WSDL Y USADOS POR EL SCRIPT
//DE NUESTRO SERVIDOR
$array_input = array(2,4,6,8,10);
//$array_input = new SoapVar($array_input,SOAP_ENC_ARRAY,SOAP_1_2);
$request = new SoapVar(array( 'array_input'=>$array_input ),SOAP_ENC_OBJECT);
//LLAMAMOS AL PROCEDIMIENTO Y CAPTURAMOS SU
//VALOR DE RETORNO EN LA VARIABLE RESPONSE
$response = $sClient->duplicar($request);
}catch (SoapFault $e){
//EN CASO DE QUE HUBO ALGUN ERROR EL BLOQUE CATCH LO CAPTURA
//EN EL CAPITULO DE MANEJO AVANZADO VEREMOS COMO CAPTURAR LOS SOAPFAULTS
echo 'Hubo un error';
var_dump($e);
}//catch
//MOSTRAMOS EL RESULTADO
echo 'El array duplicado es:';
//Como la variable $response ahora es objeto que contiene un array,
//pues lo recorremos con un FOREACH
foreach ($response->array_output as $entero){
echo '<br />'.$entero;
}//foreach
?>
Con eso podemos ejecutar el ejemplo sin problemas, les dejo las fuentes
muchas gracias por tu ejemplo esta muy bueno y espero que pronto hagas uno que tenga conexiones a base datos