Web Services con Zend Framework
A la hora de desarrollar web services, tenemos que tener en cuenta que habrá una parte de código de servidor y otra parte de código de cliente, aunque si somos la parte que define el web service no nos deberemos preocupar en la definición del código que se debe ejecutar en el cliente.
Antes de nada, deberemos habilitar en nuestro php.ini la extensión "php_soap" y reiniciar el servidor.
Una vez habilitada la extensión, para poder ofrecer nuestro servicio, deberemos crear un controlador al que podamos llamar para obtene el archivo WSDL. Además, aprovecharemos dicho controlador, para usarlo también como cliente a través de su método “clientAction”, teniendo en cuenta que este método estará integrado en cualquier desarrollo externo a nuestra aplicación, ya que a través de el, interrogarán a nuestra aplicación.
<?php
require_once 'Zend/Controller/Action.php';
class SoapController extends Zend_Controller_Action
{
private $_WSDL_URI = 'http://localhost:8080/soap?wsdl';
public function indexAction(){
$this->_helper->viewRenderer->setNoRender();
if(isset($_GET['wsdl'])) {
//Devuelve el XML con el WSDL
$this->hadleWSDL();
} else {
//Gestiona las peticiones a través de SOAP
$this->handleSOAP();
}
}
private function hadleWSDL() {
$autodiscover = new Zend_Soap_AutoDiscover();
$autodiscover->setClass('ZendExt_Application_Resource_Soaptest');
$autodiscover->handle();
exit;
}
private function handleSOAP() {
$soap = new Zend_Soap_Server($this->_WSDL_URI);
$soap->setClass('ZendExt_Application_Resource_Soaptest');
$soap->handle();
exit;
}
public function clientAction() {
try{
$client = new Zend_Soap_Client($this->_WSDL_URI);
$this->view->add_result = $client->math_add(11, 55);
$this->view->logical_not_result = $client->logical_not(true);
$this->view->sort_result = $client->simple_sort( array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple"));
}catch(Exception $e){
echo "error:" . $e->getMessage();
}
}
}
?>
El código que nos implementará la lógica de negocio asociada a los métodos definidos para nuestro web service la podemos tener definida en nuestra librería externa "/library/ZendExt/Application/Resource/WSTest.php"
<?php
class ZendExt_Application_Resource_WSTest {
/**
* Metodo que realiza la suma de dos cifras enteras
*
* @param Int $param1
* @param Int $param2
* @return Int
*/
public function suma($param1, $param2) {
return $param1+$param2;
}
/**
* Metodo de negacion logica
*
* @param boolean $param1
* @return boolean
*/
public function not($param1) {
return !$param1;
}
/**
* Metodo que ordena un array
*
* @param Array $array
* @return Array
*/
public function ordena($array) {
asort($array);
return $array;
}
}
?>
Importante: Si cambiáis el nombre de alguno de los métodos, después de haber solicitado alguna vez el archivo WSDL lo más seguro es que os devuelva un error, por lo que deberéis eliminar los archivos creados en la caché que comienzan por "wsdl-*".
Si se prentende posteriormente tener el cliente y el servidor por separado, del código anterior, bastaría con tener el método clienteAction definido en el cliente, y eliminarlo de la parte de servidor.
¡¡¡Y esto es todo por el momento!!!
¡¡¡Cualquier comentario, mejora, o ayuda sobre este tema siempre será bienvenido!!!
[ad#Google Adsense]
Si te ha gustado este artículo, te puede interesar ...
Aún no hay trackbacks.
8 junio, 2011 - 17:14
Muchas gracias por la información, esta fue de mucha utilidad.
13 junio, 2011 - 12:19
Sería interesante puedas publicar un video con tu ejemplo, pues resultaría mas didáctico y mejor aprovechado por los estudiantes de PHP. Saludos