<?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>marcuscavalcanti.net &#187; REST</title>
	<atom:link href="http://www.marcuscavalcanti.net/blog/tag/rest/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.marcuscavalcanti.net/blog</link>
	<description>Software, tecnologia e etc.</description>
	<lastBuildDate>Wed, 21 Jul 2010 03:52:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Pensando em uma arquitetura simples para integração entre sistemas</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 15:34:20 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[Arquitetura e Padrões]]></category>
		<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RESTful]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=971</guid>
		<description><![CDATA[Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.
O problema
Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um [...]]]></description>
			<content:encoded><![CDATA[<p>Tentei bolar um título melhor para o tópico, porém confesso que não consegui, mas ainda assim acho que o título se aplica no que será falado nas próximas linhas.</p>
<h3>O problema</h3>
<p>Em um projeto pessoal recente precisei fazer a integração entre três sistemas distintos, na verdade os sistemas são distintos, mas não deveriam ser. Trata-se de um site e o que ocorre é que esse mesmo site possui três módulos (sistemas) que estão em plataformas, linguagens e lugares diferentes. Conclui-se que é um projeto que foi crescendo desordenadamente e que em nenhum momento ninguém pensou em uma maneira de organizar melhor os módulos e realizar as integrações. Como esses módulos foram feitos em linguagens e plataformas diferentes, o requisito número um do cliente era que esses módulos se comunicassem e que essa comunicação fosse transparente pra ele e para quem fosse administrar o sistema.</p>
<h3>Cenário atual</h3>
<p>O site é um pequeno site de e-commerce e dos três módulos existentes, um diz respeito ao <em>frontend/backend</em> do site e é feito com .NET/SQL Server, o outro módulo é o <em>backend</em> de vendas e é feito com PHP/MySQL e o último módulo é o de <em>newsletter (mailing)</em> que também está em PHP/MySQL. O módulo de vendas foi o último a ser desenvolvido e deveria ser mantido, o problema é que o administrador do sistema precisa &#8220;inputar&#8221; todas as vendas na mão, isso mesmo, na mão! Atualmente, quando um cliente tem interesse em algum produto do site, ele envia um email ao administrador informando qual(is) o(s) produto(s) ele tem interesse e os seus dados pessoais, e por sua vez o administrador entra no módulo de vendas, cadastra esse novo cliente, cria um pedido de venda, gera um login/senha para esse cliente e envia por email para que ele possa se autenticar no módulo de venda, concluir a compra e efetuar o pagamento.</p>
<p>Além de ser algo totalmente mecânico e nada prático, não há nenhuma relação entre os módulos do site e o administrador precisa reproduzir os dados do produto, que já existe em um módulo, em outro. Eram esses problemas que deveriam ser remediados.</p>
<h3>Requisitos do cliente</h3>
<p>Um dos requisitos do cliente, era de que o site (<em>frontend e backend</em>) deveria ser construído novamente, pois o atual além de ter sido construído em uma plataforma que ele não tinha mais interesse em manter, também estava incompleto e apresentando problemas, portanto o primeiro requisito era refazer todo o site com PHP/MySQL.</p>
<p>O segundo requisito era que o processo compra de produtos deveria ser todo feito através do site, pelo cliente, e não da forma arcaica como é atualmente e que foi descrita acima.</p>
<p>O terceiro requisito era que o módulo de vendas deveria ser mantido, pois ele atendia o que o cliente precisava, sendo assim o sistema que eu iria desenvolver deveria alimentar diretamente esse módulo de vendas.</p>
<h3>Estrutura do módulo de vendas</h3>
<p>Felizmente o módulo de vendas estava construído de uma maneira que facilitou o meu trabalho, quem o desenvolveu se preocupou em criar classes de modelo, uma camada de persistência e uma camada de negócio, portanto pude pensar em uma arquitetura simples em funcional muito em função disso.</p>
<h3>Arquitetura pensada</h3>
<p>Tentei pensar em algo que não criasse uma dependência entre os sistemas e que me fizesse mexer o minímo possível, ou nada, no módulo de vendas que seria mantido. Outros fatores que levei em consideração era que eu queria algo fácil de implementar, de dar manutenção e que de certa forma fosse rápido de desenvolver.</p>
<p>Conclui o desenvolvimento do (<em>frontend/backend</em>) e parti para pensar em uma arquitetura que me permitisse fazer tudo o que citei acima e que além disso me permitisse utilizar a boa estrutura que eu encontrei no módulo de vendas.</p>
<p>Para construir o site utilizei o <a href="http://www.codeigniter.com" target="_blank" style="text-decoration: underline">Code Igniter</a>, que é um <em>framework</em> que tenho prática, e também é leve e rápido de desenvolver, mas o que vale ressaltar é que arquitetura é algo que é independente de <em>framework</em>, portanto se eu tivesse utilizado qualquer outro <em>framework</em>, ou até mesmo se eu não tivesse utilizado nenhum <em>framework</em>, não faria a mínima diferença. Nesse caso os <em>frameworks</em> escolhidos só entram como facilitadores na implantação da arquitetura.</p>
<p>Mas voltando ao foco inicial, que é explicar a arquitetura, o que eu pensei foi em criar um <a href="http://pt.wikipedia.org/wiki/Web_service" target="_blank" style="text-decoration: underline"><em>Web Service</em></a> com as operações específicas para tudo o que eu precisaria fazer no módulo de vendas, ou seja, eu precisaria identificar todas as ações que eu precisaria realizar para fazer essa integração e alimentar esse módulo. Na verdade, além de alimentar eu também precisaria recuperar algumas informações do módulo de vendas. Como os módulos (site, vendas, <em>newsletter</em>) ficariam provavelmente em servidores diferentes, em bancos diferentes e em estruturas diferentes essa era a forma mais limpa de realizar a integração sem causar dependência entre esses módulos e com isso dar manutenção seria bem mais fácil.</p>
<p>Como já estava definido que eu iria utilizar <em>Web Service</em>, eu optei por utilizar o formato <a href="http://www.xfront.com/REST-Web-Services.html" target="_blank" style="text-decoration: underline">RESTful</a>, pois eles se encaixava perfeitamente na minha necessidade: me trazia simplicidade, praticidade, facilidade, além do que no meu caso a aplicabilidade de <a href="http://en.wikipedia.org/wiki/Resource_oriented_architecture" target="_blank" style="text-decoration: underline">ROA</a>, que é o <a href="http://alexbarnett.net/blog/archive/2006/11/04/REST-Web-Services-and-ROA.aspx" target="_blank" style="text-decoration: underline">conceito que <em>Web Services</em> RESTful utilizam</a>, era muito mais evidente do que a abordagem de serviços.</p>
<p>O próximo passo era identificar os recursos necessários e criar as <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank" style="text-decoration: underline">URI</a> que eu utilizaria nos <em>requests</em> do meu<em> Web Service</em> REST, então ficou dessa forma:</p>
<ul>
<li><em>user/new</em></li>
<li><em>user/retrieve/email</em></li>
<li><em>user/retrieve/cpf</em></li>
<li><em>order/new</em></li>
<li><em>order/save/products</em></li>
<li><em>order/retrieve/last</em></li>
<li><em>shipping/calculate</em></li>
</ul>
<p>Para desenvolver esse <em>Web Service</em> RESTful resolvi utilizar o <a href="http://framework.zend.com" target="_blank" style="text-decoration: underline">Zend Framework</a>, pois ele possui alguns componentes que me ajudariam a desenvolver esse <em>Web Service</em> mais rápido, como o <a href="http://framework.zend.com/manual/en/zend.rest.html" target="_blank" style="text-decoration: underline">suporte a <em>Web Services</em> RESTful</a>, por exemplo, o ZF também tem uma <a href="http://framework.zend.com/manual/en/zend.json.html" target="_blank" style="text-decoration: underline">API para trabalhar com JSON</a> muito boa, então esse foi outro componente do ZF que eu resolvi utilizar.</p>
<p>Como no módulo de vendas já existiam classes de modelo que representavam as <a href="http://blog.rodrigoallemand.com.br/?p=138" target="_blank" style="text-decoration: underline">entidades do meu domínio</a>, o que eu fiz foi criar uma estrutura <a href="http://json.org" target="_blank" style="text-decoration: underline">JSON</a> semelhante as essas entidades e que representaria os <a href="http://www.w3.org/TR/2002/WD-ws-arch-scenarios-20020730/#S003" target="_blank" style="text-decoration: underline"><em>requests/responses</em></a> do meu <em>Web Service</em> RESTful. Paralelo a isso criei algumas classes de apoio que serviriam como os <a href="http://static.springframework.org/spring-ws/docs/1.0-m3/reference/html/ch05s02.html" target="_blank" style="text-decoration: underline"><em>Marshallers</em> e <em>Unmarshallers</em></a> do <a href="http://www.springsource.org/" target="_blank" style="text-decoration: underline">Spring</a>. <em>Marshallers</em> e <em>unmarshallers</em> são como <em>data mappers</em>, e no meu caso servem para eu mapear um objeto JSON para um objeto PHP (classes modelo) e também realizar o inverso.</p>
<p>Dessa forma com objetos JSON convertidos para objetos PHP que representavam as minhas classes modelo eu poderia usar a camada de persistência existente na aplicação para persistir todo objeto, então no caso de salvar um novo usuário, ficou assim:</p>
<p><!--DEVFMTCODE--><pre class="devcodeblock" title="PHP"><div class="devcodeoverflow"><ol><li><span style="color: #000000; font-weight: bold;">function</span> saveUser<span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>	</li><li>	<span style="color: #000088;">$userObject</span> <span style="color: #339933;">=</span> Unmarshaller<span style="color: #339933;">::</span><span style="color: #004000;">user</span><span style="color: #009900;">&#40;</span>Zend_Json<span style="color: #339933;">::</span><span style="color: #004000;">decode</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #000088;">$conn</span> 	&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #339933;">=</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">getConnectionHandler</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></li><li>&nbsp;</li><li>	<span style="color: #000088;">$result</span> 	<span style="color: #339933;">=</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$userObject</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>&nbsp;</li><li>	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$result</span> <span style="color: #009900;">&#41;</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Usuário cadastrado com sucesso.'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	</li><li>	<span style="color: #b1b100;">else</span></li><li>		<span style="color: #b1b100;">return</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'status'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'response'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$conn</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">ErrorMsg</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>	 </li><li>&nbsp;</li><li><span style="color: #009900;">&#125;</span></li><li></li></ol></div></pre><!--END_DEVFMTCODE--></p>
<p>Bem simples, né? No exemplo acima, criei algumas classes estáticas (utilitárias), a primeira me retorna um objeto de conexão com o banco de dados e a segunda classe representa o <em>unmarshaller</em> para transformar um Objeto JSON em uma classe de modelo que representa um usuário, após isso foi só persistir o usuário e retornar as mensagens correspondentes para quem está acessando recurso.</p>
<h3>Visão geral</h3>
<p>No fluxo de salvar um novo usuário, teríamos:</p>
<p>1) Site (módulo site) deseja salvar um novo usuário;<br />
2) Site monta um objeto JSON com os dados que representam o novo usuário;<br />
3) Site acessa o <em>Web Service</em> RESTful do módulo de venda através do recurso user/new;<br />
4) No módulo de venda, o método mapeado para o recurso user/new, faz <em>unmarshaller</em> do objeto JSON mapeando os valores desse objeto JSON para uma classe de modelo;<br />
5) O usuário é persistido através do objeto que foi mapeado no passo anterior;<br />
6) O Web Service RESTful retorna a mensagem correspondente para o site.</p>
<p>Quando se fala em arquitetura é comum pensarmos em algo complexo, cheio de tecnologias, frameworks e etc, mas o foco de arquitetura não deve ser esse, o foco de arquitetura deve ser pensar em uma estrutura que prime pela organização, relacionamento e reuso dos componentes de softwares envolvidos em um sistema, onde o intuito deve ser facilitar e não complicar.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/06/10/pensando-em-uma-arquitetura-simples-para-integracao-entre-sistemas/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Web Services: REST versus WS-*, WS-* versus REST</title>
		<link>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/</link>
		<comments>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 16:15:10 +0000</pubDate>
		<dc:creator>Marcus Cavalcanti</dc:creator>
				<category><![CDATA[SOA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[WSDL]]></category>

		<guid isPermaLink="false">http://www.marcuscavalcanti.net/blog/?p=904</guid>
		<description><![CDATA[Um dos maiores problemas no desenvolvimento de software é a integração entre aplicações que foram construídas sobre plataformas/linguagens distintas, onde essas aplicações deveriam conversar entre si com o intuito de trocar informações. Para resolver, ou melhor, tentar resolver esse problema, foi proposto um padrão que atende pelo nome de Web Services, que hoje é um [...]]]></description>
			<content:encoded><![CDATA[<p>Um dos maiores problemas no desenvolvimento de software é a integração entre aplicações que foram construídas sobre plataformas/linguagens distintas, onde essas aplicações deveriam conversar entre si com o intuito de trocar informações. Para resolver, ou melhor, tentar resolver esse problema, foi proposto um padrão que atende pelo nome de <em>Web Services</em>, que hoje é um padrão mantido pela <a href="http://www.w3c.org" target="_blank" style="text-decoration: underline">W3C</a> e <a href="http://www.oasis-open.org/specs/" target="_blank" style="text-decoration: underline">OASIS</a>.</p>
<p><em>Web Services</em> são componentes que permitem que duas aplicações troquem informações entre si utilizando um canal de comunicação (<a href="http://en.wikipedia.org/wiki/Computer_network" target="_blank" style="text-decoration: underline"><em>network</em></a>), na maioria das vezes o protocolo <a href="http://en.wikipedia.org/wiki/HTTP" target="_blank" style="text-decoration: underline">HTTP</a>. Existem alguns tipos de <em>Web Services</em>, mas os mais conhecidos e usados hoje em dia são: RPC, WS-* (WSDL/SOAP) e REST.</p>
<p>Dos padrões citados, provavelmente o formato mais conhecido e usado hoje em dia é o WS-*, que define que um serviço deve receber/responder mensagens no formato XML (<a href="http://en.wikipedia.org/wiki/SOAP_(protocol)" target="_blank" style="text-decoration: underline">SOAP</a>) e deve possuir um contrato que defina os seus serviços (<a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank" style="text-decoration: underline">WSDL</a>). Só que esse formato, principalmente depois da popularização do REST, vem sofrendo pesadas críticas de toda comunidade de desenvolvimento, que alega que esse formato é burocrático e complicado, enquanto o REST é um formato mais simples e objetivo.</p>
<p>Minha opinião é que tanto o padrão WS-* como o padrão REST não se substituem, pelo menos não por enquanto, e que tentar fazer essa comparação ainda não agrega, pois existem casos específicos onde REST é muito bem-vindo, assim como existem casos onde o padrão WS-* é muito bem-vindo.</p>
<h3>WS-* &#8211; Vantagens e desvantagens</h3>
<p>Uma das principais reclamações em relação a esse formato é que o mesmo <a href="http://en.wikipedia.org/wiki/WS-*" target="_blank" style="text-decoration: underline">possui N especificações</a> e que isso o torna complexo e burocrático, e de certa forma eu concordo. Só para se ter uma idéia existem mais de 15 especificações para esse formato e conhecer todas é humanamente impossível e inviável.</p>
<p>Outra reclamação é em relação ao <em><a href="http://pt.wikipedia.org/wiki/Overhead" target="_blank" style="text-decoration: underline">overhead</a></em> que a troca de mensagens de um serviço no padrão WS-* pode causar, pois todas as mensagens precisam ser envelopadas dentro de um pacote SOAP, que nada mais é que um XML padronizado. Esse <em>overhead</em> é causado, pois dentro de um envelope SOAP, o que é usado é a menor parte do conteúdo que está ali contido, dessa forma há muito &#8220;lixo&#8221;.</p>
<p>Essas duas reclamações citadas acima, são as maiores reclamações dos desenvolvedores em relação a serviços WS-*, contudo no meu modo de ver existem também muitas vantagens no uso do formato WS-*, principalmente no que diz respeito a integração entre aplicações corporativas e também em relação a <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture" target="_blank" style="text-decoration: underline">SOA</a>.</p>
<p>Por exemplo, eu trabalho em um ambiente onde existem muitos serviços, muitos mesmos, e esses serviços são desenvolvidos por N fornecedores, em N plataformas distintas e são usados por N por aplicações. É um cenário bem complexo e eu não imaginaria esse cenário sem o uso do formato WS-*. E por quê? Em primeiro lugar porque ter um contrato formal desses serviços é totalmente necessário, afinal eu preciso saber o nome desses serviços, preciso saber o que eles estão esperando receber, o que eles irão me responder e como serão esses dados. Imagine se um serviço desses mudar o caos que seria?</p>
<p>Outro fator muito importante são as ferramentas de apoio, afinal elas além de facilitar o trabalho, trazem também produtividade. Existem N ferramentas que ajudam na simulação, testes, geração de <a href="http://en.wikipedia.org/wiki/Mock_object" target="_blank" style="text-decoration: underline"><em>Mock</em>&#8217;s</a>, teste de carga, <em>debug</em> e tantas outras atividades necessárias no desenvolvimento/acesso a esses serviços. A principal ferramenta <em>free</em> usada hoje em dia é o <a href="http://www.soapui.org/" target="_blank" style="text-decoration: underline">soapUI</a>.</p>
<p>Em relação a SOA, o formato WS-* também se mostra a melhor opção. SOA é uma maneira de se construir softwares baseado no conceito de serviços, onde esses serviços devem possuir um contrato formal, devem ser independentes (possuir baixo acoplamento) e devem ser reutilizáveis. Outro princípio de SOA diz que esses serviços devem ter a capacidade de serem descobertos e nesse ponto o WS-* mais uma vez sai na frente, pois o mesmo possui o protocolo <a href="http://pt.wikipedia.org/wiki/UDDI" target="_blank" style="text-decoration: underline">UDDI</a>, que é um método utilizado para publicar e descobrir diretórios de serviço em uma arquitetura SOA.</p>
<h3>REST &#8211; O que é, vantagens e desvantagens</h3>
<p>REST é o acrônimo de <em>Representational State Transfer</em>, que é um modelo de arquitetura baseado no protocolo HTTP e que utiliza <a href="http://en.wikipedia.org/wiki/Uniform_Resource_Identifier" target="_blank" style="text-decoration: underline">URI</a> para identificação dos seus serviços. REST é uma maneira de construir serviços usando o protocolo HTTP como ele foi concebido, ou seja, usando: POST, GET, DELETE e PUT.</p>
<p>Serviços RESTful (serviços REST) partem do princípio que o protocolo HTTP é rico o suficiente para que seja criada uma abstração  &#8211; no caso WS-* seria uma abstração &#8211; para construção de serviços.</p>
<p>Uma das vantagens em utilizar serviços REST sem dúvida nenhuma é a simplicidade, afinal criar serviços REST é usar de maneira parecida o protocolo HTTP como usamos atualmente no desenvolvimento de aplicações Web, ou seja, se você usa o método POST em um formulário, você consequentemente está usando REST, a única diferença é que o submit desse formulário devolveria um conteúdo HTML, quando que em um serviço RESTful o indicado seria devolver uma estrutura mais padronizada, no caso um XML ou um <a href="http://www.json.org/" target="_blank" style="text-decoration: underline">JSON</a>, por exemplo.</p>
<p>Outra vantagem no uso de serviços REST é a performance, pois os seus <em>request/response</em> são infinitamente menores se comparados com os do formato WS-*, e são menores, porque não precisam ser envelopados dentro de um pacote SOAP, serviços REST apenas recebem o que precisam e consequentemente respondem o que é necessário.</p>
<p>Serviços construídos no formato REST também são mais humanos, ou seja, são mais compreensíveis que serviços WS-*. Isso se deve ao fato de que para construir um serviço REST não é necessário conhecer N especificações, não é necessário saber o que é WSDL, assim como também não é necessário conhecer um pacote SOAP. São mais humanos também, pois são identificados através de URI&#8217;s.</p>
<p>Dentre outras vantagens de serviços RESTful destaco a possibilidade de fazer <em>cache</em> das operações, possibilidade de criar camadas intermediárias (<em>proxy</em>, <em>gateway</em>, <em>cache servers</em>) com o intuito de aumentar a performance ou segurança e possibilidade de usar HTTPS nativamente.</p>
<p>Pensando em um ambiente corporativo, em aplicações <em>enterprise</em> e em arquitetura SOA, começam a surgir alguns problemas em relação a adoção de serviços REST, a começar pelo fato de que REST não possui um padrão oficial para descrição dos seus serviços, até existe uma frente interessada em criar esse padrão utilizando <a href="https://wadl.dev.java.net/" target="_blank" style="text-decoration: underline">WADL</a>, mas ainda não existe nada oficial, portanto essa é uma grande desvantagem.</p>
<p>Serviços REST também não possuem estado, são <em><a href="http://en.wikipedia.org/wiki/Stateless_server" target="_blank" style="text-decoration: underline">stateless</a></em>, ao contrário de serviços WS-*, pois os mesmos podem possuir estado entre uma chamada e outra. Serviços REST também não permitem requisições assíncronas e utilizando o formato WS-* é possível fazer requisições sem que seja necessário esperar uma resposta.</p>
<p>Pensando em SOA, REST não é a melhor opção, afinal, conforme citado anteriormente, REST não possui um contrato formal para definir a interface dos seus serviços, assim como também não possui uma maneira para que esses serviços possam ser publicados e descobertos.</p>
<p>Outra desvantagem no meu modo de ver, é que para construção de um processo BPEL, se faz por necessário que os serviços possuam uma interface que os descreva (WSDL), nesse caso serviços REST não seriam os mais indicados para serem usados dentro de um processo BPEL, contudo existem algumas maneiras de realizar esse <em><a href="http://whatis.techtarget.com/definition/0,,sid9_gci868091,00.html" style="text-decoration: underline" target="_blank">workaround</a></em> para usar serviços REST dentro de um processo BPEL. Dependendo da ferramenta escolhida, algumas fornecem soluções como a criação de <em>Partner Links</em> HTTP, ou seja, são <em>Partner Links</em> próprios para serviços REST, ou então, algumas outras ferramentas fornecem maneiras um pouco mais trabalhosas como a criação de um WSDL que descreva o serviço HTTP (REST).</p>
<h3>Afinal, qual devo usar?</h3>
<p>Sinto lhe frustrar, mas a resposta para essa pergunta é: depende, cada caso é um caso.</p>
<p>Não é inteligente ignorar uma ou outra opção, ou ser cego a ponto de desconsiderar os benefícios e vantagens de cada uma. Na minha opinião, fomentar essa discussão é cair no mesmo de discutir <a href="http://www.marcuscavalcanti.net/blog/2009/03/17/ponto-para-o-rails/" target="_blank" style="text-decoration: underline">&#8220;qual linguagem é melhor&#8221;</a>, afinal cada uma tem seu propósito.</p>
<p>Os fanáticos por REST costumam dizer que o formato WS-* só existe, pois os grandes <em>players</em> do mercado (Oracle, IBM, Microsoft, etc) estão envolvidos, já que esses grandes <em>players</em> desenvolvem ferramentas específicas para facilitar a criação e a manutenção a serviços construídos dessa maneira. Quem faz essa afirmação está completamente equivocado, pois por mais burocrático que serviços WS-* possam ser, eles ainda possuem uma enorme utilidade que serviços REST ainda não satisfazem.</p>
<p>Agora, no caso de serviços para celulares, PDA&#8217;s, e outros dispositivos móveis, onde cada dado enviado/recebido tem um custo alto, utilizar serviços REST é sem dúvida a melhor opção. Da mesma maneira que para prover serviços de aplicativos web, como <em><a href="http://pt.wikipedia.org/wiki/Mashup" target="_blank" style="text-decoration: underline">mashups</a></em>, REST também é a melhor opção, a maior prova disso é que em serviços como Twitter, Facebook, Amazon e até mesmo o Google, estão usando REST em larga escala. </p>
<p>Mas também existe o outro lado da moeda, pois pensando em um ambiente complexo, com muitos serviços, repositórios, ainda não dá para pensar em outro formato que não seja WS-*.</p>
<p>Enfim, mais uma vez volto ao ponto de que devemos conhecer as opções para tomar a decisão de escolher o que é mais adequado, REST não substitui WS-* e vice-versa, <a href="http://www.infoq.com/news/2007/07/wsrest" target="_blank" style="text-decoration: underline">insistir nessa rixa não agrega</a> e quem não enxerga dessa maneira, precisa rever seus conceitos, ou então estudar mais.</p>
<p>Aproveito para deixar o link para download de uma apresentação sobre REST, que fiz no meio do ano passado, na empresa que eu trabalho: <a href="http://www.marcuscavalcanti.net/blog/wp-content/uploads/apresentacao-rest.ppt" target="_blank" style="text-decoration: underline">clique para fazer download</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.marcuscavalcanti.net/blog/2009/04/13/webservices-rest-versus-ws-soap/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>
