domingo, 4 de março de 2012

WebService com Zend Framework

Depois de mais de um mês sem escrever nada no blog olha eu aqui de novo!
Hoje vou falar de algo que HOJE é pouco documentado, pouco explicado e MUITO utilizado, vou falar sobre como utilizar web service no ZEND FRAMEWORK, nesse caso SOAP.


Mas O PV me explica ai, o que é um web service? E esse tal de SOAP?

Se você não conhece e preferiu questionar eu fico muito feliz pois a dúvida é o principio da sabedoria e precisamos questionar para aprender. Afinal, ninguém nasceu sabendo.

Um web service é uma maneira de uma aplicação comunicar com um servidor Web. Tradicionalmente, quem interage com um servidor web é um ser humano, através de um browser. Se trocarmos o ser humano por uma aplicação, a interacção passa a ser por webservices.

Podem-se implementar webservices de várias maneiras. Duas delas ganharam notoriedade, por diferentes razões: SOAP e REST

SOAP(que é a que vou explicar aqui nesse artigo) é pegar numa mensagem xml, metê-la num envelope e enviá-la por HTTP (embora o SOAP permita diferentes protocolos de transporte, na prática é HTTP). A resposta vem igualmente num envelope, em xml. 

REST é usar o HTTP como ele foi concebido, com GET, POST, PUT e DELETE (estes últimos dois quase não são utilizados mas estão na especificação desde o início). Ou seja, se sabem fazer submit de forms, sabem usar REST. A diferença é que o submit de um form devolve uma página em html, e um webservice REST devolve uma página em Xml

Acho que nem preciso falar qual é o mais seguro não é? Por isso é nele que vamos "MARTELAR".

Ta legal, e como implementar isso no ZEND FRAMEWORK?

Vou utilizar como exemplo aquele Quick Start que a zend disponibiliza em seu site então faça um download la mesmo blz? 

Ele já vem com 3 controllers configurados ok? Index, Error e GuestbookController... vamos apenas utilizar o IndexController pois é ai que vamos escrever nosso webservice cliente(aquele que consome) e o server(aquele que libera).



  1. <?php
  2.   /* Carregando a classe que nosso server vai consumir */
  3. require_once realpath(APPLICATION_PATH .'/../library/').'/Calculadora.php';
  4. class IndexController extends Zend_Controller_Action {
  5.     public function init() {
  6.         /* Initialize action controller here */
  7.     }
  8.     public function indexAction() {
  9.     }
  10.     public function soapserverAction() {
  11.         if (isset($_GET['wsdl'])) {
  12.             /*
  13.              * Usar o Soap AutoDiscover para criacao do WSDL de forma dinamica
  14.              */
  15.             $autodiscover = new Zend_Soap_AutoDiscover();
  16.             $autodiscover->setClass('Calculadora');
  17.             $autodiscover->handle();
  18.         } else {
  19.             // Disponibilizar o webservice atraves do canal:
  20.             $soap = new Zend_Soap_Server("http://start.local/index/soapserver?wsdl");
  21.             $soap->setClass('Calculadora');
  22.             $soap->handle();
  23.         }
  24.         exit;
  25.     }
  26.     public function soapclienteAction() {
  27.         /* canal de chamada para webservice */
  28.         $soap = new Zend_Soap_Client("http://start.local/index/soapserver?wsdl");
  29.         echo $soap->soma(11, 2) . PHP_EOL; // imprime 3
  30.         echo $soap->subtrai(11, 2) . PHP_EOL; //imprime 9
  31.        
  32.         exit;
  33.     }
  34. }


Agora a classe "Calculadora que nosso webservice irá consumir


  1. <?php 
    /
    *
  2.  * Classe calculadora
  3.  */
  4. class Calculadora {
  5.     /**
  6.      * Realiza Soma
  7.      * @param integer $a
  8.      * @param integer $b
  9.      * @return integer
  10.      */
  11.     public function soma($a, $b) {
  12.         return $a + $b;
  13.     }
  14.     /**
  15.      * Realiza Subtracao
  16.      * @param integer $a
  17.      * @param integer $b
  18.      * @return integer
  19.      */
  20.     public function subtrai($a, $b) {
  21.         return $a - $b;
  22.     }
  23.     /**
  24.      * Concatena
  25.      * @param string $a
  26.      * @param string $b
  27.      * @return string
  28.      */
  29.     public function concatena($a, $b) {
  30.         return $a ." concatenado com". $b;
  31.     }
  32. }


Veja que no indexcontroller criamos a action soapcliente soapserver isso pq é um teste então o cliente e o servidor vão estar no mesmo lugar. O WSDL que vamos carregar é o do link do nosso servidor: http://start.local/index/soapserver?wsdl (onde start.local vc substitue pelo link do seu localhost e/ou site em que isso irá rodar).

Para testar vc acessa o seu WSDL  http://start.local/index/soapserver?wsdl e se ele retornar um XML é com a descrição da sua classe Calculadora ele esta pronto para ser utilizado então para isso esse a action cliente e faça o teste: http://start.local/index/soapcliente

Para finalizar vou explicar o que é esse carinha ai WSDL que significa Web Services Description Language e é uma linguagem baseada em XML utilizada para descrever Web Services funcionando como um contrato do serviço. Trata-se de um documento escrito em XML que além de descrever o serviço, especifica como acessá-lo e quais as operações ou métodos disponíveis.

Imagine que são as regras para trabalhar com o webservice e como assim qualquer desenvolvedor de qualquer tecnologia consegue trabalhar com isso.


Vou disponibilizar um webservice SERVER na WEB para testes o WSDL será:
http://www.profpv.com/index/soapserver?wsdl

Assim todo mundo pode testar, inclusive o método que trabalha com STRING. 
Valeu e até a próxima