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

Envio y Recepción de Arrays Basicos via SOAP con PHP5

This entry was posted on Friday, April 25th, 2008 at 10:04 am and is filed under Desarrollo Web, PHP, Soap, Soluciones, Web Services. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

One Response to “Envio y Recepción de Arrays Basicos via SOAP con PHP5”

  1. Juan Pablo on July 29th, 2008 at 8:02 am

    muchas gracias por tu ejemplo esta muy bueno y espero que pronto hagas uno que tenga conexiones a base datos

Leave a Reply