<?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>blog.caelum.com.br &#187; restful</title>
	<atom:link href="http://blog.caelum.com.br/tag/restful/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.caelum.com.br</link>
	<description>blog dos desenvolvedores da Caelum</description>
	<lastBuildDate>Thu, 09 Feb 2012 13:04:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>RESTfulie com C# &#8211; O poder do dynamic</title>
		<link>http://blog.caelum.com.br/restfulie-com-csharp-o-poder-do-dynamic/</link>
		<comments>http://blog.caelum.com.br/restfulie-com-csharp-o-poder-do-dynamic/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 09:10:23 +0000</pubDate>
		<dc:creator>Luiz Costa</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[restfulie]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[web services]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2111</guid>
		<description><![CDATA[Há um mês lançamos uma versão inicial do projeto Restfulie para C#, projeto que tem ganhado bastante visibilidade.  Para deixa-lo tão fácil quanto a versão original em Ruby, utilizamos as novas características dinâmicas da versão 4.0 do C#, alterando a estrutura de objetos em tempo de execução. Algumas pessoas acham esse recurso perigoso demais, outras acham a escolha certa. <a href="http://blog.caelum.com.br/restfulie-com-csharp-o-poder-do-dynamic/#more-2111'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Há um mês lançamos uma versão inicial do projeto <a id="hkwe" title="Restfulie" href="http://restfulie.caelumobjects.com/">Restfulie</a> para C#, <a href="http://www.infoq.com/interviews/Restfulie">projeto que tem ganhado bastante visibilidade</a>.  Para deixa-lo tão fácil quanto a <a id="zzom" title="versão original" href="http://restfulie.caelumobjects.com/ruby">versão original em Ruby</a>, utilizamos as novas características dinâmicas da versão 4.0 do C#, alterando a estrutura de objetos em tempo de execução. Algumas pessoas acham <a id="ukkx" title="isso perigoso demais" href="http://www.infoq.com/news/2009/11/Compromise-Dynamic-C-Sharp">esse recurso perigoso demais</a>, <a id="wozb" title="outras acham muito poderoso." href="http://are%20dynamic%20languages%20going%20to%20replace%20static%20languages/?">outras acham a escolha certa</a>. </p>
<p>Para enxergar o uso da nova palavra chave <code>dynamic</code>, consideremos um recurso REST que representa um pedido com sua representação em XML como a que segue:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;pedido&gt;
  &lt;data&gt;26/12/2009 11:40&lt;/data&gt;
  &lt;total&gt;300.00&lt;/total&gt;
  &lt;atom:link rel=”refresh” href=”http://www.caelum.com.br/pedidos/1″ xmlns:atom=”http://www.w3.org/2005/Atom”/&gt;
  &lt;atom:link rel=”update” href=”http://www.caelum.com.br/pedidos/1″ xmlns:atom=”…”/&gt;
  &lt;atom:link rel=”pagar” href=”http://www.caelum.com.br/pedidos’/1/pagar” xmlns:atom=”…”/&gt;
  &lt;atom:link rel=”excluir” href=”http://www.caelum.com.br/pedidos/1″ xmlns:atom=”…”/&gt;
  &lt;atom:link rel=”obterCliente” href=”http://www.caelum.com.br/pedidos/1/clientexmlns:atom=” xmlns:atom=”…”/&gt;
&lt;/pedido&gt;
</pre>
<p>É interessante notar que neste XML temos os dados (data, total) e temos ações que podem ser executadas sobre este recurso. Por exemplo, depois que obtivemos a representação deste recurso, é possível executar algumas ações, descritas através de links no próprio xml: <code>pagar</code>, <code>excluir</code>, <code>obterCliente</code>. Para obter a representação de um recurso no restfulie C#  fazemos da seguinte maneira:</p>
<pre class="brush: csharp; title: ; notranslate">
dynamic pedido =
  Restfulie.At(“www.caelum.com.br\pedidos\1”).Get();
</pre>
<p>Repare que o primeiro passo que fazemos ao declarar a variável pedido é ignorar o seu tipo.  Ou melhor, dizer explicitamente que ela é dinâmica, através do tipo <strong><a id="kqsw" title="dynamic" href="http://msdn.microsoft.com/en-us/library/dd264741%28VS.100%29.aspx">dynamic</a></strong>. Isso nos trás uma série de vantagens como, por exemplo, simplesmente acessar suas <a id="cvhs" title="properties" href="http://msdn.microsoft.com/en-us/library/x9fsa0sw.aspx">properties</a>:</p>
<pre class="brush: csharp; title: ; notranslate">
Console.WriteLine(string.Format(“A data do pedido é: {0}”, pedido.Data));
Console.WriteLine(string.Format(“O valor total do pedido é: {0}”, pedido.Total));
</pre>
<p>Além de podermos acessar suas properties, podemos também seguir os links que estão disponíveis na representação, utilizando invocações de métodos:</p>
<pre class="brush: csharp; title: ; notranslate">
pedido.Pagar();
pedido.Excluir();

dynamic cliente = pedido.obterCliente();
Console.WriteLine(string.Format(“Nome do cliente: {0}”, cliente.Nome));
</pre>
<p>Isso é bastante poderoso: perceba que do lado cliente não precisamos definir nada, apenas dizer que uma referência é dinâmica. Mas como esta mágica acontece com o C#?</p>
<p>Além de existir a palavra reservada <code>dynamic</code> existe uma classe <a id="gquj" title="DynamicObject" href="http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject%28VS.100%29.aspx">DynamicObject</a> no C#. Diferente de Ruby, em C#, nem todos os objetos podem ser <a id="q8at" title="modificados em Runtime." href="http://dotnetslackers.com/articles/csharp/Dynamic-Binding-in-a-Static-Language-Part-1.aspx">modificados em Runtime.</a> Para que seja possível adicionar comportamento dinâmico em a um objeto, precisamos estender a classe <code>DynamicObject</code>.</p>
<p>Ao estender esta classe, ganhamos a oportunidade de alterar o comportamento do objeto. Quando fizermos então uma invocação a <code>pedido.Total</code>, o que de fato tem que ocorrer aqui? De acordo com o xml de representação do recurso, devemos obter o valor que está na tag &lt;Total&gt;.</p>
<p>Para implementar isso utilizamos um recurso bem parecido com o <a id="mvat" title="method_missing em Ruby" href="http://andersonleiteblog.wordpress.com/2010/02/10/metaprogramacao-method_missing/">method_missing em Ruby</a> e, de certa forma, como as dynamic proxies do Java (apesar destas precisarem de interfaces explícitas). Vejamos a classe <code>DynamicXmlResource</code>:</p>
<pre class="brush: csharp; title: ; notranslate">
class DynamicXmlResource : DynamicObject {
   private XElement xmlRepresentation;

   public override bool TryGetMember(GetMemberBinder binder,
             out object result) {
     //pseudo código que encontra a tag xml de acordo
     //com o nome da property informada
     object = XmlRepresentation.FindXMLTagWithName( binder.Name)
             .ReadTheValue()
     return result != null;
   }
}
</pre>
<p>Esta classe estende <code>DynamicObject</code> e tem um atributo que é a representação do recurso em XML (xmlRepresentation). O mais interessante é o método <code>TryGetMember</code> que  intercepta qualquer invocação a um <code>Get</code> de uma property e nos permite fazer o que for necessário. No nosso caso, o que é feito é buscar o valor da da property no xml, que nesse caso tem o nome igual  ao da tag do xml. Com isso, toda vez que fizermos <code>pedido.Total</code>, o que está acontecendo é a invocação de <code>TryGetMember</code> da classe <code>DynamicXmlResource</code>.</p>
<p>Da mesma forma que existe o método <code>TryGetMember</code>, existem outros que nos permitem alterar o comportamento do objeto. No nosso projeto, também fizemos o uso do <code>TryInvokeMember</code>:</p>
<pre class="brush: csharp; title: ; notranslate">
class DynamicXmlResource : DynamicObject {
  private XElement xmlRepresentation;

  public override bool TryGetMember(GetMemberBinder binder, out object result) {
    result = XmlRepresentation.FindXMLTagWithName(binder.Name).ReadTheValue()
    return result != null;
  }

  public override bool TryInvokeMember(InvokeMemberBinder binder,
        object[] args, out object result) {
    // pseudo código para pegar o link no xml a partir do nome do método
    object link = XmlRepresentation.FindRelAttributeWithName(Binder.Name).ReadTheLink();
    if (link == null)
      throw new ArgumentException
        (string.Format(&quot;There is not method defined with name:&quot;, binder.Name));

    // faz a chamada remota para o servidor através do link.
    HttpRemoteResponse response = 
      (HttpRemoteResponse) this.InvokeRemoteResource(value.ToString(), binder.Name);
    return result != null;
  }
}
</pre>
<p>Este método também é parecido com o <code>method_missing</code>, mas neste caso ele intercepta a chamada de um método. No caso do restfulie,  quando chamamos um método qualquer, o que ele faz é, procurar na representação XML e descobrir o link relacionado com o nome do método. Depois disso é só fazer uma requisição http. Novamente, quando fizermos a invocação <strong>pedido.Pagar()</strong>, ela será interceptada pelo <code>TryInvokeMember</code> e executará uma invocação remota para o Restfulie Server.</p>
<p>Utilizando estas características do C# conseguimos alcançar algo muito próximo do que se faz com o Restfulie Ruby, como comparamos a seguir. Em Ruby:</p>
<pre class="brush: ruby; title: ; notranslate">
pedido = Restfulie.at(“http://restfulie-test.heroku.com/orders/14”).get
puts pedido.customer-name
pedido.cancel
</pre>
<p>E, em C#, temos o código tão sucinto quanto:</p>
<pre class="brush: csharp; title: ; notranslate">
dynamic pedido = Restfulie.At(“http://restfulie-test.heroku.com/orders/14.xml”).Get();
Console.WriteLine(pedido.customer_name);
pedido.Cancel();
</pre>
<p>Uma das consequências da utilização de tipos dinâmicos é que perdemos as vantagens da fase da tipagem estática: não há code complete, e pode ser que a gente erre o nome de um membro, como <code>customer_name</code>, e só viremos a saber disso em tempo de execução. Nada que testes unitários bem colocados não resolvam. </p>
<p>Como podemos ver, a utilização de tipos dinâmicos facilita bastante a utilização da api do Restfulie, assim como diversos outros frameworks vem tirando vantagem com o auxílio desse recurso.</p>
<p>Reforçando a tendência, o Java também anda nesse caminho, com a <a id="usta" title="JSR 292" href="http://jcp.org/en/jsr/detail?id=292">JSR 292</a>, que melhora o suporte de linguagens dinâmicas na JVM. Em abril de 2003 Robert C. Martin escreveu o artigo &#8220;<a id="d-bs" title="Are Dynamic Languages Going to Replace Static Languages?&quot;" href="http://www.artima.com/weblogs/viewpost.jsp?thread=4639">As linguagens dinâmicas vão substituir as estáticas?&#8221;</a> e, no final deste artigo, ele faz seguinte pergunta: <em>Estaremos todos nós programando numa linguagem dinamicamente tipada em 2010?</em>. Isso não aconteceu, mas com certeza cada vez mais cenários de utilização estão surgindo, e a tendência é cada vez mais forte.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/restfulie-com-csharp-o-poder-do-dynamic/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Hipermídia e contratos dinâmicos: menor acoplamento</title>
		<link>http://blog.caelum.com.br/hipermidia-e-contratos-dinamicos-menor-acoplamento/</link>
		<comments>http://blog.caelum.com.br/hipermidia-e-contratos-dinamicos-menor-acoplamento/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 11:02:56 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[hypermedia]]></category>
		<category><![CDATA[microformat]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[schema]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[testes]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1559</guid>
		<description><![CDATA[Nos últimos anos você vem comprando livros em um website: você acessa o site inicial www.amazon.com, procura pelo livro que deseja comprar, adiciona-o ao seu carrinho, escolhe o método de pagamento e finaliza a compra. Na época do Natal, o site muda: existe agora uma promoção de fim de ano e você se depara com <a href="http://blog.caelum.com.br/hipermidia-e-contratos-dinamicos-menor-acoplamento/#more-1559'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Nos últimos anos você vem comprando livros em um website: você acessa o site inicial www.amazon.com, procura pelo livro que deseja comprar, adiciona-o ao seu carrinho, escolhe o método de pagamento e finaliza a compra.</p>
<p>Na época do Natal, o site muda: existe agora uma promoção de fim de ano e você se depara com um conteúdo inesperado: existem funcionalidades e informações novas (como um programa de desconto através de cupons). Como reage um humano ao encontrar a mudança com novas possibilidades de iteração em um site?</p>
<ul>
<li> Gritar: &#8220;contrato violado! não comprarei mais nada!</li>
<li> Ignorar as novas informações e executar o processo</li>
<li> Usar o intelecto humano e se aproveitar das novas informações</li>
</ul>
<p>Como humanos sabemos o quão natural é agir de maneira a ignorar as informações &#8211; caso elas não contribuam com meu objetivo &#8211; ou tirar proveito delas.</p>
<p>A opção 1 só se concretiza caso existisse um comprometimento total a maneira que o site disponibilizava suas informações e ao processo: se meu acoplamento for alto e o que eu espero seja fixo, imutável. Infelizmente robôs não são ainda capazes de raciocionar como nós e executar a última opção.</p>
<p>O conteúdo hipermídia permite evoluir o servidor com funcionalidades e dados sem quebrar os clientes consumidores <b>por padrão</b>. Ninguém deixaria de comprar pois fornecemos funcionalidades e dados novos em relação aos recursos disponibilizados.</p>
<p>Isso permitiu a evolução de sites por diversos anos sem que usuários enviassem emails para o responsável reclamando da nova função que foi adicionada, dizendo que não utilizarão o sistema pois existe conteúdo extra.</p>
<p><b>Hipermídia <a href="http://jim.webber.name/2008/04/19/30b4f0e9-f67a-4310-bf38-ca0a3423206e.aspx">permite um baixo acoplamento</a> entre o cliente e o servidor</b> e pode ser levado para o mundo da automatização: a web dos sistemas. Na web humana, validamos nossos contratos com o usuário final através do uso de testes end-to-end, verificando a existência de funcionalidades como o usuário o faria.</p>
<p>Diversas opções de ferramentas como <a href="http://selenium-rc.seleniumhq.org/">selenium-rc</a> e <a href="http://code.google.com/p/webdriver/">webdriver</a> fornecem funcionalidades para garantir que o <a href="http://behaviour-driven.org/">comportamento esperado</a> não será quebrado com novos releases.</p>
<p>Eles não validam tudo retornado pela requisição, dando espaço para a ::forward-compatibility::, a capacidade de evoluir nosso sistema no servidor sem quebrar o comportamento esperado. Por exemplo, adicionar novas funcionalidades ou campos não relativos ao teste não deve quebrar o mesmo.</p>
<p>Na web para sistemas integrados, a representação mais comum é o <a href="http://www.w3.org/XML/">xml</a>, <a href="http://en.wikipedia.org/wiki/Hypermedia">que não suporta conteúdo hipermídia</a>, uma vez que uris devem ser tratadas como texto (de acordo com a especificação) então acabamos criando nossos próprios <a href="http://www.w3.org/TR/CSS2/media.html">media-types</a>, como vnd/caelum+xml, onde há a definição de como elas devem ser tratadas: <a href="http://www.google.com/url?q=http://jim.webber.name/downloads/presentations/2007-11-Qcon/A%2520Couple%2520of%2520Ways%2520to%2520Skin%2520an%2520Internet-Scale%2520Cat.ppt&#038;ei=C8wfS_2UEoqHuAeZorD0Cw&#038;sa=X&#038;oi=nshc&#038;resnum=1&#038;ct=result&#038;cd=1&#038;ved=0CAoQzgQoAA&#038;usg=AFQjCNEHzQJVbgNxn6Dgstl7dZiFpR7mUQ">o nosso próprio micro formato.</a></p>
<p>Existem diversas alternativas para criar esquemas <a href="http://en.wikipedia.org/wiki/Forward_compatibility">forward</a> e <a href="http://en.wikipedia.org/wiki/Backward_compatibility">backward</a> compatíveis mas infelizmente esse não é o comportamento padrão de arquivos como o formato ::xsd:: e arquitetos não se lembram disso ao definir seus esquemas, o suporte é opcional.</p>
<p>Dentre essas opções, a mais fácil e possivelmente perigosa envolve <a href="http://bill.burkecentral.com/2009/03/31/rest-needs-polymorphic-xsd/#comment-2520">permitir qualquer tipo de conteúdo em qualquer campo</a>, enquanto outra solução <a href="http://www.ibm.com/developerworks/xml/library/ws-tip-xsdchoice.html">envolve o uso de tipos polimórficos</a>: um perigoso início de schema-hell controlando diversas versões para uma mesma funcionalidade.</p>
<p><a href="http://www.infoq.com/articles/subbu-allamaraju-rest">Micro formatos como os que podemos criar permitem a definição de uma estrutura fixa e uma dinâmica</a>: um contrato parcialmente fixo, com garantias para validação e compatibilidade, além de parcialmente dinâmico, com liberdade para evolução, diminuindo o acoplamento que seu sistema possuia ao utilizar um esquema totalmente fixo.</p>
<p>Mas a responsabilidade de não quebrar o contrato original fixo ainda é do servidor.</p>
<p>Na web humana, <em>xhtml</em> permite validar a estrutura (o contrato) enquanto é responsabilidade sua (seus testes) não remover o campo de busca de livro, caso contrário o processo não se completa.</p>
<p>Enquanto esquemas permitem a validação de dados, os testes permitem a validação dos processos. Ambos devem ser escritos de maneira a permitir a evolução desacoplada do servidor e do cliente. E quais seriam então as partes dinâmicas do meu contrato?</p>
<p>Os possíveis estados de seu recurso podem variar com o tempo: uma aplicação para empréstimo pode ser só aprovada ou recusada, mas com o passar do tempo a empresa pode decidir a existência de um novo estado: &#8220;prolongado&#8221;.</p>
<p>As relações entre seu recurso e outros recursos também variam: um cliente pode ter uma lista de serviços contratados atualmente, acessando a sua representação via links. É natural imaginar que surjam novos serviços e que o cliente mude suas contratações.</p>
<p>As transições e operações disponíveis para seus recursos também são dinâmicas: <a href="http://rest.blueoxen.net/cgi-bin/wiki.pl?HttpMethods">suportando um método HTTP novo</a> ou um novo link não quebra a existência de clientes que consomem as transições e operações existentes até então.</p>
<p>Todo esse dinamismo é guiado através de hiperlinks e conteúdo hipermídia. Como os clientes terão certeza que não quebramos o contrato dinâmico?</p>
<p>Da mesma maneira que implementamos <a href="http://dannorth.net/introducing-bdd">testes para garantir o comportamento esperado</a>, precisamos deles para garantir que o processo não é alterado no servidor.</p>
<p>Os testes end-to-end são a única garantia de que não quebramos os processos junto ao cliente, seja ele humano ou outro serviço.</p>
<p><a href="http://www.w3.org/XML/Schema">Esquemas xml</a> <a href="http://guilhermesilveira.wordpress.com/2009/12/03/resteasy-where-did-the-hypermedia-go-to/#comment-51">podem ser usados de maneira a garantir flexibilidade e compatibilidade</a>, mas não é o comportamento padrão de tal ferramenta: depende muito mais do usuário conhecer e fazer o uso adequado dela.</p>
<p><a href="http://www.subbu.org/blog/2009/04/atom-is-not-soap">ATOM</a> é um exemplo que suporta <b>por padrão</b> contratos dinâmicos: ao seguir o <a href="http://www.xml.com/pub/a/2003/12/03/versioning.html">Must Ignore</a>, ganhamos forward e backward compatibility. Contratos dinâmicos fornecem dicas para os frameworks, permitindo ao servidor guiar o cliente naquilo que pode executar ou acessar.</p>
<p>A consequência principal de <a href="http://blog.caelum.com.br/2008/02/18/os-7-habitos-dos-desenvolvedores-de-webservices-altamente-eficazes/#comment-30904">contratos dinâmicos é o baixo acoplamento</a>.</p>
<p><a href="http://www.github.com/caelum/restfulie-java">O Restfulie</a> foca no poder do hipermídia como facilitador na evolução a médio e longo prazo: não são URIs elegantes ou a adoção do protocolo HTTP sozinhos que criam sistemas de baixo acoplamento.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/hipermidia-e-contratos-dinamicos-menor-acoplamento/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Arquitetura REST com Java: JAX-RS</title>
		<link>http://blog.caelum.com.br/arquitetura-rest-com-java-jax-rs/</link>
		<comments>http://blog.caelum.com.br/arquitetura-rest-com-java-jax-rs/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 16:00:50 +0000</pubDate>
		<dc:creator>Sérgio Azevedo Junior</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[javaee6]]></category>
		<category><![CDATA[jax-rs]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[roa]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[webservices]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=1456</guid>
		<description><![CDATA[A necessidade de trocar informações entre aplicações motivou diferentes abordagens para &#8220;integração de dados&#8221;. Desde soluções simples e questionáveis como utilizar um banco de dados compartilhado, ou realizar troca de arquivos até soluções mais elaboradas que utilizam objetos distribuidos (COM e Corba). Em diversos momentos não temos somente a integração de sistemas diferentes mas a <a href="http://blog.caelum.com.br/arquitetura-rest-com-java-jax-rs/#more-1456'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2009/12/Picture-2.png" width="240" />
		</p><p>A necessidade de trocar informações entre aplicações motivou diferentes abordagens para &#8220;integração de dados&#8221;. Desde soluções simples e questionáveis como utilizar um <a href="http://www.eaipatterns.com/SharedDataBaseIntegration.html">banco de dados compartilhado</a>, ou realizar <a href="http://www.eaipatterns.com/FileTransferIntegration.html">troca de arquivos</a> até soluções mais elaboradas que utilizam objetos distribuidos (<a href="http://www.microsoft.com/com/default.mspx">COM</a> e <a href="http://www.cs.wustl.edu/~schmidt/corba-overview.html">Corba</a>). Em diversos momentos não temos somente a integração de sistemas diferentes mas a distribuição de um único sistema em diversas partes também pode ser integrada da mesma maneira.</p>
<p>A solução de integração denominada <a href="http://en.wikipedia.org/wiki/Web_service">Webservices</a>, que já é relativamente <a href="http://blog.caelum.com.br/webservices-sem-servidor-de-aplicacao-no-java-6/">simples de implementar</a>, é a mais utilizada hoje em dia, que vemos em profundidade no curso <a href="http://www.caelum.com.br/curso/fj-31-java-ee-web-services/">FJ-31</a>.</p>
<p>A Web é amplamente utilizada e reconhecida principalmente por sua arquitetura robusta, tolerante a falhas e escalável. Quem sustenta a Web nesses fatores e lhe dá todo este poder é o protocolo HTTP. Este protocolo inocente que utilizamos &#8220;meio que sem saber&#8221; em nossos navegadores de internet está presente na Web inteira, e inclusive em nossos Webservices. Não seria ótimo se eles tirassem proveito das caracteristicas do protocolo HTTP, sem que isso nos desse muito trabalho?</p>
<p>A especifição <a href="http://jcp.org/aboutJava/communityprocess/final/jsr311/index.html">JSR-311 JAX-RS</a> de Restful webservices (que faz parte agora do <a href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview.html">Java EE 6</a>) tornou isso simples e possível. Diferentemente do tradicional SOAP &#8211; em sua versão amplamente utilizada &#8211; e WSDL, o JAX-RS foca um pouco mais em URIs e nos detalhes do protocolo HTTP para se beneficiar de seus recursos.</p>
<p>Como utilizamos o JAX-RS para buscar dados de um <code>Pedido</code>?</p>
<pre class="brush: java; title: ; notranslate">
@Path(&quot;/pedido/{id}&quot;)
public class PedidoResource {
 @GET
@Produces( { MediaType.APPLICATION_XML })
 public Pedido getPedidoById(@PathParam(&quot;id&quot;) Long id) {
   PedidoDAO pedidoDAO = new PedidoDAO();
   Pedido pedido = pedidoDAO.getPedidoById(id);
   return pedido;
 }
}
</pre>
<p>Através da classe <code>PedidoResource</code>, disponibilizaremos os dados de nossos pedidos no formato XML. Vamos supor que configuramos que este serviço esteja disponível no endereço: <em>http://caelum.com.br/rest/pedido</em>. Para conseguirmos informações sobre o pedido 10, podemos acessar a url <em>http://caelum.com.br/rest/pedido/10</em>, através de nosso browser de internet favorito. E assim receberiamos um resultado parecido com este:</p>
<pre class="brush: xml; title: ; notranslate">
&lt;pedido&gt;
  &lt;dataPedido&gt;2009-12-10T18:50:57.173-02:00&lt;/dataPedido&gt;
  &lt;descricao&gt;Pedido 10&lt;/descricao&gt;
  &lt;id&gt;10&lt;/id&gt;
  &lt;total&gt;3000.25&lt;/total&gt;
&lt;/pedido&gt;
</pre>
<p>A api JAX-RS nos permite trabalhar com o que foi denominado Restful WebServices. E segundo a arquitetura REST nós devemos expor as informações importantes de nossa aplicação como <em>recursos</em>. Para isso precisamos criar uma classe que é definida pela especificação como <code>RootResource</code>. Em nosso exemplo a classe <code>PedidoResource</code> é a nossa , e para ser acessivel aos clientes fornecemos a ela um url através da anotaçao <span style="color: #646464;">@Path</span><span style="color: #000000;">(</span><span style="color: #2a00ff;">&#8220;/pedido/{id}&#8221;</span><span style="color: #000000;">)</span>, e o próprio JAX-RS reconhece <span style="color: #2a00ff; ">{id} </span>como sendo um parametro que é enviado através do url.</p>
<p>Um recurso pode responder a operações do protocolo HTTP, dentre as quais destacam-se: POST, GET, PUT e DELETE. Nós escolhemos que nosso serviço responderá apenas a solitações do tipo GET, a anotação <span style="color: #646464; ">@GET</span> acima do método <code>getPedidoById</code> é quem define isso. Essas anotações de caminho e de qual método HTTP podem acessar determinado método estão presentes em frameworks como o <a href="http://static.springsource.org/docs/Spring-MVC-step-by-step/">Spring MVC</a> e o <a href="http://www.vraptor.com.br/">VRaptor</a>.</p>
<p>Depois dizemos que uma solitação GET para nosso recurso irá produzir um resposta do tipo XML, através da anotação <span style="color: #000000;"><span style="color: #646464;">@Produces</span><span style="color: #000000;">( { </span><span style="color: #000000;">MediaType.APPLICATION_XML </span><span style="color: #000000;">})</span>.<br />
</span><br />
É impotante destacar que esta anotação não é a responsável por serializar o objeto no formato XML. O JAX-RS usa o <a href="http://blog.caelum.com.br/jaxb-xml-e-java-de-maos-dadas/">JAX-B</a> como serializador padrão, basta para isso colocar a anotação <span style="color: #646464;">@XmlRootElement</span> na classe desejada, assim como nós fizemos em nossa classe pedido.</p>
<pre class="brush: java; title: ; notranslate">
@XmlRootElement
public class Pedido {

 private Long id;
 private String descricao;
 private double total;
 private Calendar dataPedido;
 //Getters e Setters...

}
</pre>
<p>Agora que entendemos melhor o nosso serviço, ou seja, como acessar nosso <em>recurso</em>, podemos olhar melhor para nosso cliente. Como nosso cliente do serviço web pode ser um simples browser de internet, conseguimos usar o browser para consumir nosso serviço web porque eles já estão bem acostumados a realizar operações HTTP do tipo GET.</p>
<p>Mas os browser&#8217;s não são nossos únicos clientes. Podemos criar diferentes tipos, e inclusive ter aplicações desktop como clientes. Vejamos um exemplo de uma aplicação cliente, que o usa a API do <a href="http://hc.apache.org/httpcomponents-client-ga/">httpclient</a> do grupo apache:</p>
<pre class="brush: java; title: ; notranslate">
public class CaelumRestClient {

  public static void main(String[] args) throws Exception {
    HttpClient httpClient = new HttpClient();

    GetMethod httpMethod =
      new GetMethod(&quot;http://caelum/rest/pedido/20&quot;);

    httpMethod.addRequestHeader(&quot;Accept&quot;, &quot;application/xml&quot;);
    httpClient.executeMethod(httpMethod);
    Scanner scan =
      new Scanner(httpMethod.getResponseBodyAsStream());
    PrintStream ps = System.out;
    while (scan.hasNext()) {
      ps.println(scan.nextLine());
    }
    httpMethod.releaseConnection();
  }
}
</pre>
<p>Este cliente é bem simples, ele faz  apenas o mesmo trabalho que o browser já havia feito. Mas nada nos impede de implementar coisas bem mais interessantes. Poderiamos fazer com que este cliente desserializasse nosso objeto pedido. Para isso precisarimos apenas de um parser XML para extrair os valores do xml e depois popular um objeto Pedido com estes dados. A partir daí poderiamos utilizar este objeto em nossa aplicação.</p>
<p>A única <a href="http://guilhermesilveira.wordpress.com/2009/12/03/resteasy-where-did-the-hypermedia-go-to/">limitação</a> é que esta representação XML não nos diz nada sobre quais ações estão disponiveis para o nosso objeto Pedido, nem mesmo quais as relações desse recurso com o mundo afora. Uma alternativa seria utilizar o <a href="http://github.com/caelum/restfulie-java">restfulie</a> framework <a href="http://www.infoq.com/news/2009/12/restfulie">muito discutido hoje em dia</a> e idealizado por <a href="http://guilhermesilveira.wordpress.com/">Guilherme Silveira</a> e desenvolvido em conjunto com o pessoal da <a href="http://www.caelum.com.br">Caelum</a>, que usa o conceito de hypermedia para expor além dos dados as ações que um determinado objeto pode realizar.</p>
<p>Em breve teremos um post do próprio Guilherme sobre a importância do conteúdo hypermedia na arquitetura REST.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/arquitetura-rest-com-java-jax-rs/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>SOA sem tentar vender middleware?</title>
		<link>http://blog.caelum.com.br/soa-sem-tentar-vender-middleware/</link>
		<comments>http://blog.caelum.com.br/soa-sem-tentar-vender-middleware/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 09:58:11 +0000</pubDate>
		<dc:creator>Fabio Kung</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[buzzword]]></category>
		<category><![CDATA[corba]]></category>
		<category><![CDATA[integração]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[palestra]]></category>
		<category><![CDATA[pox]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[rpc]]></category>
		<category><![CDATA[serviço]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[wsdl]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=671</guid>
		<description><![CDATA[Na última sexta-feira, estive junto com o Alexandre Magno em um evento organizado pelo pessoal da Stefanini, no Rio de Janeiro. O Alexandre falou um pouco sobre a sua especialidade, Scrum. Eu dei uma palestra sobre SOA e como sempre a expectativa do pessoal era ouvir mais uma palestra cheia de buzzword, que de alguma <a href="http://blog.caelum.com.br/soa-sem-tentar-vender-middleware/#more-671'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Na última sexta-feira, estive junto com o <a href="http://amagno.blogspot.com/">Alexandre Magno</a> em um evento organizado pelo pessoal da Stefanini, no Rio de Janeiro. O Alexandre falou um pouco sobre a sua especialidade, Scrum. Eu dei uma palestra sobre SOA e como sempre a expectativa do pessoal era ouvir mais uma palestra cheia de <a href="http://en.wikipedia.org/wiki/Buzzword">buzzword</a>, que de alguma forma tenta empurrar algum produto de integração e que tenha ESB (Enterprise Service Bus) no nome.</p>
<p>O público era bem misto, com pessoal técnico e não técnico. Bastante gente veio conversar comigo no fim da palestra e demonstraram surpresa com relação a abordagem diferente sobre SOA. Um pouco na linha do fantástico <a href="http://www.infoq.com/interviews/jim-webber-qcon-london">Guerrilla SOA</a> do Jim Webber, tentei falar sobre o assunto sem tentar vender nenhum produto gigante <em>middleware-de-integração</em>. Se você ainda não viu: <a href="http://jim.webber.name/downloads/presentations/2009-01-SOA-Forum.zip">veja <strong>agora</strong></a>, sério. A minha palestra fala um pouco sobre como <em>SOA não precisa ser buzzword</em>, <strong>SOA é integração</strong>:</p>
<p>
<div style="width:425px;text-align:left" id="__ss_1158360"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/fabiokung/soa-no-precisa-ser-buzzword?type=presentation" title="SOA não precisa ser buzzword">SOA não precisa ser buzzword</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=soa-090317105205-phpapp02&#038;rel=0&#038;stripped_title=soa-no-precisa-ser-buzzword" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=soa-090317105205-phpapp02&#038;rel=0&#038;stripped_title=soa-no-precisa-ser-buzzword" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/fabiokung">Fabio Kung</a>.</div>
</div>
<p><br/></p>
<p>Talvez a palestra não faça tanto sentido para quem não esteve presente, mas fiquem a vontade para dar uma olhada e comentar a respeito.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/soa-sem-tentar-vender-middleware/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Java 6, as APIs de XML, Webservices e classloaders</title>
		<link>http://blog.caelum.com.br/java-6-as-apis-de-xml-webservices-e-classloaders/</link>
		<comments>http://blog.caelum.com.br/java-6-as-apis-de-xml-webservices-e-classloaders/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 07:50:23 +0000</pubDate>
		<dc:creator>Paulo Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[classloader]]></category>
		<category><![CDATA[jax]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[webservices]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2007/12/17/java-6-as-apis-de-xml-webservices-e-classloaders/</guid>
		<description><![CDATA[A Sun vem há muito tempo fazendo esforços para facilitar a manipulação de XML e de webservices na plataforma. São tantos projetos, subprojetos e especificações que podemos facilmente nos encontrar perdidos no meio de tantas siglas. Elas são: JAXP (pacote java.xml no geral) &#8211; Processamento geral de XML, com os já antigos SAX e DOM, <a href="http://blog.caelum.com.br/java-6-as-apis-de-xml-webservices-e-classloaders/#more-180'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>A Sun vem há <a href="http://jcp.org/en/jsr/detail?id=67">muito tempo</a> fazendo esforços para facilitar a manipulação de <a href="http://community.java.net/java-ws-xml/">XML e de webservices</a> na plataforma. São tantos projetos, subprojetos e especificações que podemos facilmente nos encontrar perdidos no meio de tantas siglas. Elas são:</p>
<p>	 <a href="http://jcp.org/en/jsr/detail?id=206">JAXP</a> (pacote <code>java.xml</code> no geral) &#8211; Processamento geral de XML, com os já antigos SAX e DOM, além de transformadores (XLST) e XPath.</p>
<p><a href="http://jcp.org/en/jsr/detail?id=222">JAXB</a> (pacote <code>javax.xml.bind</code>) &#8211; Assocaição/mapeamento de classes java para XML.</p>
<p>	<a href="http://jcp.org/en/jsr/detail?id=224">JAX-WS</a> (pacote <code>javax.xml.ws</code>) &#8211; Criação e consumo de webservices. Aliada a <a href="http://jcp.org/en/jsr/detail?id=181">especificação de metadados para webservices</a> (<code>pacote javax.jws</code>), <a href="http://blog.caelum.com.br/criando-um-webservice-com-a-jsr-181/">previamente já vista aqui no  blog</a>, a JAX-WS tornasse poderosa e fácil de usar.</p>
<p><a href="http://jcp.org/en/jsr/detail?id=93">JAXR</a> (pacote <code>javax.xml.registry</code>) &#8211; para acesso aos registros de serviços XMLs, como UDDI.</p>
<p>	<a href="http://jcp.org/en/jsr/detail?id=101">JAX-RPC</a> (pacote <code>javax.xml.rpc</code>) &#8211; era o nome antigo do atual JAX-WS. O JAX-WS mudou de nome e já apareceu como 2.0, essa mundaça foi justificada pelo fato dessa API passar a trabalhar bem mais próxima da API do JAXB, além do óbvio marketing.</p>
<p>E a Sun não para por aí, temos mais especificações: a duvidosa JSR 267 que possibilita um JSP acessar diretamente um webservice (!) através de taglibs e a esperada <a href="http://jcp.org/en/jsr/detail?id=311">JSR 311</a> para trabalhar com serviços de maneira RESTful, oferecendo simples anotações para expor métodos Java através de URI + métodos HTTP. </p>
<p>Não são <a href="http://wiki.java.net/bin/view/Javawsxml/ProjectStatus">todos subprojetos de manipulação de xml com java</a> que viraram especificações, e as que viraram nem todas estão no Java SE. A <a href="http://asn1.elibel.tm.fr/xml/finf.htm">Fast Infoset</a> é uma especificação ISO para representação binária do padrão XML (economizando assim espaço e banda, além de melhorar performance do parsing) possui <a href="https://fi.dev.java.net/">uma implementação Java</a>, utilizada dentro do <a href="https://metro.dev.java.net/">Metro</a>, projeto que fornece os recursos de webservices do Glassfish.</p>
<p><a href="http://java.sun.com/javase/technologies/webservices.jsp">Muitas dessas APIs</a>, juntamente com implementações de referência (RIs), agora estão presentes no java SE 6.0, que antes eram opcionais. Qual é o problema disso? Até então diversos servidores de aplicação e frameworks traziam embutido implementações do JAXB, JAX-WS, etc. Ao rodar essas aplicações com o Java 6 o sistema de classloading da plataforma vai primeiro carregar as classes da api padrão, mesmo que você tenha implementações dessas APIS de XML no classpath. O ruim aqui é que muitos servidores de aplicação acabam se amarrando a detalhes de sua própria implementação e versão, como é <a href="http://www.jboss.com/index.html?module=bb&#038;op=viewtopic&#038;t=99036">esse caso do JBoss</a> com o JAX-WS. Quando rodado com o Java 6, temos a seguinte exception quando você tenta acessar um webservice que está implantando no servidor:</p>
<p><code>java.lang.UnsupportedOperationException: setProperty must be overridden by all subclasses of SOAPMessage<br />
  at javax.xml.soap.SOAPMessage.setProperty(SOAPMessage.java:424)<br />
</code></p>
<p>Enfrentamos esse problema recentemente, e para <a href="http://thesmallpotato.blogspot.com/2007/06/jdk-16-jboss-420-ejb3-web-service-axis2.html">resolve-lo</a> usamos o sistema de endosso de jars (<a href="http://java.sun.com/j2se/1.5.0/docs/guide/standards/index.html">endorsed jars</a>) do Java: determinados diretórios podem ser configurados para que alguns pacotes específicos possam ser carregados destes antes do Classloader tentar chegar ao rt.jar.</p>
<p><a href="http://weblogs.java.net/blog/kohsuke/archive/2006/12/jaxb_21_release.html">Um</a> <a href="http://weblogs.java.net/blog/kohsuke/archive/2007/02/running_jaxbws.html">outro</a> <a href="http://weblogs.java.net/blog/kohsuke/archive/2007/02/howitworks_runn.html">problema</a> <a href="http://www.guj.com.br/posts/list/76001.java">comum</a> é com o JAXB: o Java 6 vem com a versão 2.0, se você precisar usar a 1.1 ou a 2.1, vai ter problemas. O interessante é que a JAXB do Java SE já foi projetada para ela mesma detectar se o classloading foi correto, ou se partiu de uma versão posterior/anterior a ela, mostrando uma mensagem de erro amigável. Para outras bibliotecas esse problema pode ser <strong>muito</strong> sutil: o classloader pode acabar carregando <strong>parte </strong>da biblioteca de uma versão recente, já que algumas classes novas só existem nesse jar, e o restante de uma outra antiga, resultando exceptions como <code>NoSuchMethodError</code>, que não mostram claramente que o problema é a existência de dois jars de versões diferentes no classpath daquela aplicação.</p>
<p>Podemos ver que mesmo seguindos boas práticas, isolando bibliotecas e não usando a terrível variável de ambiente CLASSPATH, acabamos sempre enfrentando o <a href="http://nullability.org/?p=95">classloader</a> <a href="http://www.kumpera.net/blog/index.php/2007/05/09/classloader-hell/">hell</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/java-6-as-apis-de-xml-webservices-e-classloaders/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ajax no VRaptor: JSON da maneira fácil</title>
		<link>http://blog.caelum.com.br/ajax-no-vraptor-json-da-maneira-facil/</link>
		<comments>http://blog.caelum.com.br/ajax-no-vraptor-json-da-maneira-facil/#comments</comments>
		<pubDate>Thu, 09 Nov 2006 03:22:40 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[restful]]></category>
		<category><![CDATA[vraptor]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/2006/11/08/ajax-no-vraptor-json-da-maneira-facil/</guid>
		<description><![CDATA[Vamos falar um pouco de web antes que o Paulo Silveira transforme esse blog em um livro de Hibernate! O Fabio Kung deu a idéia de usar JSON para fazer a estrutura básica de Ajax do VRaptor. O Paulo, que detesta(va) trabalhar com JavaScript e interfaces com o usuário, gostou bastante da maneira simples de <a href="http://blog.caelum.com.br/ajax-no-vraptor-json-da-maneira-facil/#more-67'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Vamos falar um pouco de web antes que o Paulo Silveira transforme esse blog em um livro de Hibernate!</p>
<p>O Fabio Kung deu a idéia de usar <a href="http://json.org/">JSON</a> para fazer a estrutura básica de Ajax do <a href="http://www.vraptor.com.br/">VRaptor</a>. O Paulo, que detesta(va) trabalhar com JavaScript e interfaces com o usuário, gostou bastante da maneira simples de se representar objetos com JSON. Ele correu atrás de diversas bibliotecas como a <a href="http://developer.berlios.de/projects/jsontools/">JSON-tools</a> e a <a href="http://json-lib.sourceforge.net/">JSON-lib</a> mas achou que uma dependência apenas para isso seria muita coisa, já que não haveria a necessidade de consumir JSON como Java, apenas produzir. Ele encontrou um <a href="http://blog.stringtree.org/2006/08/12/json/">código na internet bem simples</a>, mas quando foi usar descobriu uma série de testes que falhariam, então ele, juntamente com o Nico Steppat, mexeu e criou o próprio <a href="http://vraptor2.cvs.sourceforge.net/vraptor2/vraptor2/src/main/java/org/vraptor/remote/json/JSONWriter.java?revision=1.4&#038;view=markup">JSONWriter do VRaptor</a>, junto com um <a href="http://vraptor2.cvs.sourceforge.net/vraptor2/vraptor2/src/test/java/org/vraptor/remote/JSONSerializerTest.java?revision=1.3&#038;view=markup">longo test case</a>. </p>
<p>JSON é uma notação simples para definir uma variável em JavaScript que pode ser facilmente traduzida para um objeto de outras linguagens. Muitos frameworks para AJAX, como o <a href="http://dojotoolkit.org/">Dojo</a> e o <a href="http://www.prototypejs.org/">Prototype</a>, consomem mensagens JSON. E agora no VRaptor, dada uma simples classe como essa:</p>
<pre class="brush: java; title: ; notranslate">
@Component
public class ContatoController {

        private List&lt;User&gt; users = new ArrayList&lt;User&gt;();

        @Remotable
        public void lista() {
                // puxaria do banco
                users.add(new User(1,&quot;Paulo&quot;));
                users.add(new User(2,&quot;Guilherme&quot;));
        }

        public List&lt;User&gt; getUsers() {
                return users;
        }
}
</pre>
<p>Basta você anotar o método como <code>@Remotable</code> e acessar <code>contato.list.ajax.logic</code> pela URL, que o resultado será:</p>
<p><code>{"users":[{"nome":"Paulo","id":1},{"nome":"Guilherme","id":2}]}</code></p>
<p>Pronto para ser consumido por um browser! Você pode ver no site <a href="http://vraptor.org/ajax.html">mais detalhes sobre o AJAX com o VRaptor</a>.</p>
<p>O Paulo ficou empolgado com a remotabilidade, e agora está implementando o RESTful do VRaptor da mesma maneira: <code>contatos.lista.xml.logic</code> vai te renderizar os mesmos objetos só que em XML! Já está no CVS e estará presente uma versão básica na versão 2.2.4 (assim como integração com Spring). Isso será não só útil para expor serviços, mas também para integrar seus componentes VRaptor com consumidores de XML como o <a href="http://www.adobe.com/products/flex/">Adobe Flex</a> e o <a href="http://www.openlaszlo.com/">OpenLaszlo</a>. O próximo passo é aceitar as requisições XML e JSON, não só apenas produzi-los. </p>
<p>Dei hoje uma palestra sobre esse assunto no SouJava, fazendo analogias com <a href="http://en.wikipedia.org/wiki/Service-oriented_architecture">SOA</a> e <a href="http://www.osoa.org/display/Main/Service+Component+Architecture+Home">Service Component Architecture</a> que o Paulo tanto elogia no <a href="http://incubator.apache.org/tuscany/">Apache Tuscany</a>. Ele quer dirigir o desenvolvimento do VRaptor para esse lado: poder expor facilmente seus componentes web como serviços, facilitando a futura integração e manutenção, dois pontos que nós desenvolvedores sofremos muito atualmente com os sistemas legados.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/ajax-no-vraptor-json-da-maneira-facil/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

