<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>UZED &#187; SOAP</title>
	<atom:link href="http://uzed.com.br/tag/soap/feed/" rel="self" type="application/rss+xml" />
	<link>http://uzed.com.br</link>
	<description>Informação Livre!</description>
	<lastBuildDate>Wed, 14 Jul 2010 06:03:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>SOAP com Zend Framework</title>
		<link>http://uzed.com.br/soap-com-zend-framework/</link>
		<comments>http://uzed.com.br/soap-com-zend-framework/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 21:04:04 +0000</pubDate>
		<dc:creator>zedmaster</dc:creator>
				<category><![CDATA[Informática]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Zend_Soap]]></category>

		<guid isPermaLink="false">http://uzed.com.br/?p=226</guid>
		<description><![CDATA[Objetivo O objetivo deste tutorial é ensinar a criar um Servidor SOAP, utilizando a biblioteca do Zend Framework. Pedi para o meu amigo Artista Frustrado, elaborar uma introdução a webservice, e fazer exemplos em outras linguagens, confira. Material Componentes do Zend Framework: Zend_Loader Zend_Soap Zend_Soap_Client Zend_Soap_AutoDiscover Arquivos soap.tar.bz2: /index.php /client.php /Client /Calculadora.php /Server /Calculadora.php /ServerSoap.php [...]]]></description>
			<content:encoded><![CDATA[<h4>Objetivo</h4>
<p>    O objetivo deste tutorial é ensinar a criar um Servidor SOAP, utilizando<br />
a biblioteca do Zend Framework.<br />
    Pedi para o meu amigo <a href="http://www.frustrado.com.br/main/index.php?title=Web_Services"> Artista Frustrado</a>, elaborar uma introdução a webservice, e fazer exemplos em outras linguagens, confira.<br />
</p>
<h4>Material</h4>
<p><strong>Componentes do Zend Framework:</strong></p>
<ul>
<li>Zend_Loader</li>
<li>Zend_Soap</li>
<li>Zend_Soap_Client</li>
<li>Zend_Soap_AutoDiscover</li>
</ul>
<p><strong>Arquivos <a href='http://uzed.com.br/wp-content/uploads/2009/02/soap.tar.bz2'>soap.tar.bz2</a>:</strong></p>
<pre lang="Bash">
/index.php
/client.php
/Client
    /Calculadora.php
/Server
    /Calculadora.php
    /ServerSoap.php
/README
</pre>
<p><strong>Testado no seguinte  ambiente:</strong></p>
<ul>
<li>Versão do Zend Framework testada: 1.7.5</li>
<li>Sistema Operacional: Linux</li>
<li>Distribuição: Debian Lenny</li>
<li>Versão do PHP:  PHP 5.2.6-1+lenny2</li>
<li>Versão do Apache: Apache/2.2.9 (Debian)</li>
</ul>
<p><strong>Material recomendado para leitura:</strong></p>
<ul>
<li><a href="http://br.php.net/manual/pt_BR/language.oop5.php">Orientação a Objeto no PHP5</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.soap.html">Zend_Soap</a></li>
<li><a href="http://br.php.net/manual/pt_BR/function.serialize.php">Serialize</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169676">Web Services Essentials</a></li>
<li><a href="http://www.temporeal.com.br/produtos.php?id=169836">Programming Web Services with SOAP</a></li>
</ul>
<h3>SOAP</h3>
<p>    O SOAP é um protocolo de comunicação entre o web service e o cliente. Suas especificações não são simplesmente uma transferência de XML basica, são envolvidas diversas regras para aplicações em diveras plataformas e formatos de XML.<br />
</p>
<p><strong>Quando utilizar SOAP?</strong></p>
<p>    Quando você não quer disponibilizar a apresentação da camada so seu aplicativo, e sim, apenas algumas funcionalidades, evitando abrir conexões com bancos.</p>
<p>    Quando você tem que iteragir com outros sistemas homogeneos. Exemplo, o seu fornecedor tem uma aplicação em .NET e precisa acessar uncionalidades do seu sistema que é feito em PHP. Assim, temos linguagens, sistemas operacionais e banco de dados diferentes podendo se comunicar.</p>
<p>    Quando você quer centralizar as regras de negócios no servidor. Usando clientes que acessam o servidor, sendo eles qualquer dispositivo (PDA, Terminal, celular etc.)<br />
</p>
<h3>Configurando o Ambiente</h3>
<p><strong>Temos a seguinte estrutura de pastas:</strong></p>
<pre lang="Bash">
/soap
    /index.php
    /client.php
   /Client
        /Calculadora.php
    /Server
        /Calculadora.php
        /ServerSoap.php
    /README
/zf
</pre>
<p>Na pasta soap é aonde ficam os arquivos e na pasta zf a biblioteca do Zend Framework.</p>
<p>- Descompacte o arquivo <a href='http://uzed.com.br/wp-content/uploads/2009/02/soap.tar.bz2'>soap.tar.bz2</a> na sua pasta web (no meu caso foi na pasta /var/www)</p>
<p>- Configure o apache para apontar para a pasta do soap<br />
No Linux:</p>
<pre lang="Bash">
<virtualhost *:80>
    ServerName soap.localhost
    DocumentRoot /mnt/dados/www/soap
</virtualhost>
</pre>
<p>- Adicione no arquivo hosts: 127.0.0.1  soap.localhost<br />
No Linux: adicione a linha no arquivo /etc/hosts</p>
<p>- Reinicie o apache</p>
<p>- Teste no browser os endereços:<br />
 &#8211; http://soap.localhost<br />
 &#8211; http://soap.localhost?wsdl</p>
<p>- Finalmente execute o cliente:<br />
No Linux:</p>
<pre lang="Bash">
:# php cliente.php

Deve aparecer a seguinte resposta:
##############################

Lista das funções disponíveis:
array(3) {
  [0]=>
  string(12) "string ola()"
  [1]=>
  string(25) "int somar(int $a, int $b)"
  [2]=>
  string(45) "string objeto(string $objeto, string $metodo)"
}

ola() -> Oi

somar(2,2) -> 4

calculadora->somar(3,3) -> 6

calculadora->naoexiste() -> O método: naoexiste() não foi implementado.

##############################
</pre>
<p>Pronto você já esta usando SOAP.</p>
<h4>Exemplo</h4>
<p>    O nosso exemplo consiste em um servidor web rodando um web service em PHP com Zend_Soap_Client Zend Framework, e um cliente também em PHP que acessa a mesma máquina através do console, no endereço http://soap.localhost.</p>
<p>    O cliente deve solicitar ao servidor algumas funções, e obter suas respostas.</p>
<p>O arquivo index.php contém o código para a criação do arquivo WSDL e do servidor SOAP.<br />
O Zend_Soap_AutoDiscover cria o arquivo WSDL para o servidor SOAP.<br />
O Zend_Soap que executa as funções cadastradas no WSDL, por isso que é passado por parâmetro a url http://soap.localhost/index.php?wsdl .</p>
<p>arquivo index.php</p>
<pre lang="PHP">
set_include_path(
    '../zf/ZendFramework-1.7.5/library/'
    . PATH_SEPARATOR . get_include_path()
);

require_once "Server/Calculadora.php";
require_once "Server/Soap.php";
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

ini_set("soap.wsdl_cache_enabled", 0); //** Limpa o cache

if(isset($_GET['wsdl'])) {
    //** Cria o arquivo WSDL automaticamente
    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('ServerSoap');
    $autodiscover->handle();
} else {
    //** Executa o servidor SOAP
    $soap = new Zend_Soap_Server("http://soap.localhost/index.php?wsdl");
    $soap->setClass('ServerSoap');
    $soap->handle();
}
</pre>
<p><strong>IMPORTANTE: </strong>Deve-se colocar o tipo de dados que os métodos recebem e retornam usando os tipos de dados do <a href="http://manual.phpdoc.org/HTMLframesConverter/default/">PHPDOC</a>. Veja nos comentários do exemplo.</p>
<p>arquivo Server/Soap.php</p>
<pre lang="PHP">
class ServerSoap
{
    /**
     *  @return string
     */
    public function ola()
    {
        return "Oi";
    }

    /**
     * @param int $a
     * @param int $b
     * @return int
     */
    public function somar($a,$b)
    {
        return $a + $b;
    }

    /**
     * Executa uma classe vinda do cliente.
     *
     * @param string $objeto
     * @param string $metodo
     * @return string
     */
    public function objeto($objeto, $metodo)
    {
        $tmp = unserialize($objeto);

        //** Verifica se o método existe para o $objeto
        $class_methods = get_class_methods($tmp);
        foreach ($class_methods as $method_name) {
            if($method_name == $metodo)
            {
                $tmp->$metodo();
                return serialize($tmp);
            }
        }

        $tmp->msg = "O método: {$metodo}() não foi implementado.";
        return serialize($tmp);
    }
}
</pre>
<p>O Zend_Soap_Client conecta no servidor SOAP, passando a url do WSDL. Para acessar as funções cadastradas basta a variável instanciada e o nome da função.</p>
<p>arquivo client.php:</p>
<pre lang="PHP">
set_include_path(
    '../zf/ZendFramework-1.7.5/library/'
    . PATH_SEPARATOR . get_include_path()
);

require_once "Client/Calculadora.php";
require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

ini_set("soap.wsdl_cache_enabled", 0); //** Limpa o cache

//** Inicia a conexão com o cliente
$client = new Zend_Soap_Client("http://soap.localhost/index.php?wsdl");

echo "\n##############################\n\n";

echo "Lista das funções disponíveis:\n";
var_dump($client->getFunctions());

//** Chama a função ola()
echo "\nola() -> ".$client->ola() ."\n\n";

//** Chama a função somar(a,b)
echo "somar(2,2) -> ".$client->somar(2,2) ."\n\n";

//** Cria o objeto Calculadora e passa para o SOAP executar a soma
$calculadora = new Calculadora(3,3);

$soapCalculadora =  $client->objeto(serialize($calculadora), "somar"); //* A Calculadora tem que ser serializada antes de passar para o SOAP.
$unserializeCalculadora = unserialize($soapCalculadora); //* A Calculadora tem que ser deserializada antes de chamar o metodo resposta().
echo "calculadora->somar(3,3) -> ".$unserializeCalculadora->resposta()."\n\n"; 

$erroCalculadora = $client->objeto(serialize($calculadora), "naoexiste");//** Tentando executar um método inexistente.
$erroCalculadora = unserialize($erroCalculadora);
echo "calculadora->naoexiste() -> ".$erroCalculadora->msg."\n";

echo "\n##############################\n\n";
</pre>
<h3>A classe Calculadora</h3>
<p>Temos duas instâncias do objeto Calculadora, uma para o servidor , aonde contém  o método calcular() e a do cliente aonde temos o método resposta().<br />
Para passar o objeto Calculadora do cliente para o servidor, e depois do servidor para o cliente, usamos uma técnica chamada <a href="http://br.php.net/manual/pt_BR/function.serialize.php">serialização</a>.</p>
<p>Server/Calculadora.php</p>
<pre lang="PHP">
/**
 * Classe calculadora do servidor
 *
 */
class Calculadora
{
    public $a;
    public $b;
    public $resposta;

    /**
     * Executa a soma
     *
     */
    public function somar()
    {
        $this->resposta = $this->a + $this->b;
    }
}
</pre>
<p>Client/Calculadora.php</p>
<pre lang="PHP">
/**
 * Classe calculadora do cliente
 *
 */
class Calculadora
{
    public $a;
    public $b;
    public $resposta;

    /**
     * Construtor da classe
     *
     * @param int $a
     * @param int $b
     * @return void
     */
    public function __construct($a, $b)
    {
        $this->a = $a;
        $this->b = $b;
    }

    /**
     * Retorna a resposta da soma
     *
     * @return int
     */
    public function resposta()
    {
        return $this->resposta;
    }
}
</pre>
<p>Para dúvidas ou críticas construtivas entre em contato.</p>
]]></content:encoded>
			<wfw:commentRss>http://uzed.com.br/soap-com-zend-framework/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
