<?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; rest</title>
	<atom:link href="http://blog.caelum.com.br/tag/rest/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>Evento CaelumDay Brasília</title>
		<link>http://blog.caelum.com.br/evento-caelumday-brasilia/</link>
		<comments>http://blog.caelum.com.br/evento-caelumday-brasilia/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 06:44:05 +0000</pubDate>
		<dc:creator>Sérgio Lopes</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Inovação]]></category>
		<category><![CDATA[bsb]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[eventos]]></category>
		<category><![CDATA[jboss]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[seam]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2851</guid>
		<description><![CDATA[Dia 17 de Julho acontece o evento CaelumDay Brasília. É o primeiro evento da Caelum realizado na capital federal, após a abertura da unidade na cidade no fim do ano passado. Entre as palestras, Guilherme Silveira, criador do Restfluie e CTO da Caelum, apresentará o keynote &#8220;Arquiteturas escaláveis e REST&#8221; e Rails 3. Guilherme Moreira, <a href="http://blog.caelum.com.br/evento-caelumday-brasilia/#more-2851'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://www.caelum.com.br/caelumdaybsb/images/h1-logo-trans.png" width="240" />
		</p><p><img src="http://www.caelum.com.br/caelumdaybsb/images/h1-logo-trans.png" alt="CaelumDay Brasília" align="left" style="margin: 0 20px 20px 0"/>Dia 17 de Julho acontece o evento <a href="http://www.caelum.com.br/caelumdaybsb/"><b>CaelumDay Brasília</b></a>. É o primeiro evento da Caelum realizado na capital federal, após a abertura da unidade na cidade no fim do ano passado.</p>
<p><img src="http://www.caelum.com.br/caelumdaybsb/images/img-box-trans.png" alt="" align="right" />Entre as palestras, <b>Guilherme Silveira</b>, criador do Restfluie e CTO da Caelum, apresentará o keynote &#8220;Arquiteturas escaláveis e REST&#8221; e Rails 3. <b>Guilherme Moreira</b>, diretor da unidade Brasília, apresentará &#8220;Domain Driven Design &#8211; além dos conceitos&#8221;. Teremos ainda outras palestras com temas como TDD, JBoss Seam e empreendedorismo.</p>
<p>Confira a <a href="http://www.caelum.com.br/caelumdaybsb/programacao.html">programação completa</a> e <a href="http://www.caelum.com.br/caelumdaybsb/inscricao.html">faça já sua inscrição</a> com preço promocional. Alunos e ex-alunos da Caelum ainda recebem um desconto adicional.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/evento-caelumday-brasilia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diminuindo acoplamento de sistemas com REST, e video!</title>
		<link>http://blog.caelum.com.br/diminuindo-acoplamento-de-sistemas-com-rest-e-video/</link>
		<comments>http://blog.caelum.com.br/diminuindo-acoplamento-de-sistemas-com-rest-e-video/#comments</comments>
		<pubDate>Fri, 28 May 2010 08:01:58 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[restfulie]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[webservices]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2541</guid>
		<description><![CDATA[Muitos ainda me perguntam qual é a real vantagem do REST sobre os modelos mais tradicionais . Ao integrar sistemas, a implementação de acesso ou de processos costuma ser feita de maneira sequencial, onde esperamos resultados específicos de nosso servidor. Esperar um resultado específico de um servidor é criar um grande acoplamento, e desejamos diminuir <a href="http://blog.caelum.com.br/diminuindo-acoplamento-de-sistemas-com-rest-e-video/#more-2541'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p>Muitos ainda me perguntam qual é a real vantagem do REST sobre os modelos mais tradicionais . Ao integrar sistemas, a implementação de acesso ou de <a href="http://en.wikipedia.org/wiki/Business_process_management">processos</a> costuma ser feita de <a href="http://en.wikipedia.org/wiki/BPEL#The_BPEL_language">maneira sequencial</a>, onde esperamos resultados específicos de nosso servidor.</p>
<p>Esperar um resultado específico de um servidor é criar um grande acoplamento,  e desejamos diminuir isso.</p>
<p>Em <a href="http://restfulie.caelum.com.br">clientes REST</a>, e em business processes modelados com REST, atingimos um nível de desacoplamento bem maior. Imagine o sistema a seguir (<a href="http://github.com/caelum/restfulie-provisioning/blob/master/test.rb#L77">entre outros</a>) que efetuaria compras em um site como <a href="http://www.amazon.com">a amazon</a>:</p>
<p><code><br />
Quando tem um item que quero comprar<br />
E tem um carrinho de compras<br />
Mas nao desejei nada<br />
Entao deseje este produto primeiramente</p>
<p>Quando tem um item que quero comprar<br />
E tem um carrinho de compras<br />
Entao deseje este produto</p>
<p>Quando estou no carrinho<br />
E ainda quero comprar produtos<br />
Entao começe novamente</p>
<p>Quando tem um pagamento<br />
Entao prepare o pagamento<br />
 </code></p>
<p>O código acima funciona e pode ser visto em execução na terceira parte da série Rest do zero. Nesse processo modelado como Rest, diversas evoluções poderão ocorrer no servidor sem quebrar o cliente, como por exemplo:</p>
<p>1. Após adicionar um produto ao carrinho, caso o servidor passe a redirecionar para uma sugestão de produto ao invés do carrinho, o cliente continua funcionando normalmente.</p>
<p>2. Caso não encontre um dos produtos, o cliente consegue pagar.</p>
<p>3. Caso o servidor não possua o produto, passará um link para outra empresa que vende ele, e eu executarei o processo na outra empresa, sem perceber nada.</p>
<p>4. Se eu desejar fazer a compra desde o início em outro site, que não a amazon, basta mudar o ponto de entrada de uma URI da amazon para uma URI de outro sistema.</p>
<p>Note que nos beneficiamos com <a href="http://www.ibm.com/developerworks/java/library/ws-soa-backcomp/">compatibilidade com código antigo</a>, <a href="http://en.wikipedia.org/wiki/Forward_compatibility">futuro</a> e ainda somos capazes de atingir novos objetivos em outros sistemas sem saber da existência dos mesmos. Além disso passamos a poder comparar preço em diversos sites sem mudar uma linha de código, utilizando media types conhecidos (como <a href="http://en.wikipedia.org/wiki/AtomPub">Atom</a> ou <a href="http://www.w3.org/TR/xhtml-rdfa-primer/">RDFa</a>).</p>
<p><b>Esse poder não é alcançado com modelos tradicionais de processo,</b> e <a href="http://soa.sys-con.com/node/291050">por vezes é deixado de lado</a>. É isso que REST e hipermídia traz para nossos sistemas, por exemplo.</p>
<p>Os modelos tradicionais acabam <a href="http://bill-poole.blogspot.com/2008/04/avoid-command-messages.html">utilizando mensagens que são comandos</a> ao invés de trocar documentos. Apesar de nossa DSL parecer um comando ela é somente uma DSL customizável, executando a troca de documentos que você desejar.</p>
<p>O trabalho de mapear nossos processos de maneira mais genérica através do uso de <a href="http://en.wikipedia.org/wiki/HATEOAS">hipermídia</a> foi descrito em <a href="http://portal.acm.org/toc.cfm?id=1798354&#038;type=proceeding&#038;coll=GUIDE&#038;dl=GUIDE&#038;CFID=91726189&#038;CFTOKEN=81407006">artigos publicados recentemente no portal da ACM</a>.</p>
<p>Imaginemos agora o processo tradicional:</p>
<ol>
<li> Executa uma busca</li>
<li> Adiciona o produto ao carrinho</li>
<li> Executa outra busca</li>
<li> Adiciona o produto ao carrinho</li>
<li> Paga</li>
</ol>
<p>Em um sistema de web services clássico, onde temos diversos serviços, como o servidor me diria que devo pagar em outro sistema sem que eu precise escrever nem uma linha de código? Isso iria quebrar o meu cliente, e gerar a necessidade de codificar já pensando nessas falhas e eventuais evoluções do sistema. </p>
<p>Se o servidor passou a suportar somente uma determinada quantidade de produtos no seu carrinho, seu cliente quebrará pois não foi feito adapatdo a isso, o cliente REST se adapta e compra o que for possível.</p>
<p>Se nosso produto ou empresa utiliza esses modelos tradicionais de business process e web services e <a href="http://www.manageability.org/blog/archive/20021119%23lt_p_gt_in_a/view">cada mudança no serviço está implicando em altos custos de mudança nos clientes</a>, temos um grande indício de que esse modelo tradicional apresenta o alto acoplamento que uma arquitetura REST está tentando combater.</p>
<p>Serviços web tradicionais <b><a href="http://www.ibm.com/developerworks/webservices/library/ws-soa-tightcoupling/index.html">desacoplam</a></b> um pouco mais que outras maneiras tradicionais de RPC, <a href="http://intertwingly.net/blog/2008/03/23/Connecting#c1206306269">mas ainda mantém muito acoplamento</a>.</p>
<p><strong>Se o custo de manutenção de seu código cliente está alto, é porque seu web service te acoplou demasiadamente ao servidor e aos schemas relacionados.</strong></p>
<p>A seguir você encontra um vídeo de introdução ao acoplamento que o método tradicional apresenta:</p>
<p><center><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=12085657&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=12085657&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p><a href="http://vimeo.com/12085657">Minimizando acoplamento com REST</a> from <a href="http://vimeo.com/user1362352">Caelum</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
<p></center></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/diminuindo-acoplamento-de-sistemas-com-rest-e-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Últimos aprendizados e inovações na Caelum</title>
		<link>http://blog.caelum.com.br/ultimos-aprendizados-e-inovacoes-na-caelum/</link>
		<comments>http://blog.caelum.com.br/ultimos-aprendizados-e-inovacoes-na-caelum/#comments</comments>
		<pubDate>Thu, 27 May 2010 21:02:11 +0000</pubDate>
		<dc:creator>Anderson Leite</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Web Design]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[css3]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[jpa]]></category>
		<category><![CDATA[jsf]]></category>
		<category><![CDATA[lean]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=2516</guid>
		<description><![CDATA[Inovação é parte fundamental da missão da Caelum. E, como uma empresa de treinamentos, Ensinar e Aprender são nosso dia a dia. Muitos nos perguntam o que devem estudar no seu tempo livre, onde devem investir. A Caelum tem seguido várias linhas e iniciativas que eu gostaria de apresentar nesse post. De tempos em tempos, <a href="http://blog.caelum.com.br/ultimos-aprendizados-e-inovacoes-na-caelum/#more-2516'" 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/2010/05/Picture-31.png" width="240" />
		</p><p><b>Inovação</b> é parte fundamental da missão da Caelum. E, como uma empresa de treinamentos, <b>Ensinar</b> e <b>Aprender</b> são nosso dia a dia. Muitos nos perguntam o que devem estudar no seu tempo livre, onde devem investir. A Caelum tem seguido várias linhas e iniciativas que eu gostaria de apresentar nesse post.</p>
<p>De tempos em tempos, temos na Caelum um tech day interno onde cada um apresenta o que tem estudado e aplicado nos projetos e nas aulas. O último encontro aconteceu nesse mês de maio e trouxe muitas novidades com testes, métodos ágeis, web, linguagens dinâmicas, estruturas de dados, cloud e mais.</p>
<p><a href="http://twitter.com/guilhermecaelum">Guilherme Silveira</a> falou sobre <strong>SOA versus REST</strong>,  recapitulando REST e fazendo comparações com o objetivo de ajudar nas escolhas de quando usar ou não as tecnologias. Mostrou um pouco de seus últimos experimentos com hypermedia e <a href="http://blog.caelumobjects.com/2010/04/19/rest-maturity-model/">code on demand</a>.</p>
<p>O <a href="https://twitter.com/lucascs">Lucas Cavalcanti</a> e o <a href="https://twitter.com/cairesvs">Caires Vinicius</a> apresentaram a palestra <strong>Shoulda stay or shoulda go?</strong>, mostrando pontos positivos e negativos da utilização do <a href="http://github.com/thoughtbot/shoulda">Shoulda</a> em um projeto Ruby on Rails que passaram enquanto estavam em um projeto de consultoria da Caelum. Ainda em Rails, <a href="http://twitter.com/davidpaniz">David Paniz</a> e <a href="http://twitter.com/pmatiello">Pedro Matiello</a> apresentaram <strong>Aerotrem: Colocando sua app Rails no ar</strong>. Eles mostraram como manter, de maneira fácil, várias VMs ruby na mesma máquina. Foram além e fizeram o HAProxy balanceando dois servidores Web, além de mostrar como fazer o deploy sua aplicação no cloud da Amazon via o <a href="http://heroku.com/">Heroku</a>.</p>
<p>O <a href="https://twitter.com/paulo_caelum">Paulo Silveira</a> apresentou <strong>Tudo que você sempre precisou saber sobre Hash e um pouco mais</strong>. Paulo mostrou como funciona um Hash, mostrou algumas implementações em Java e como funções de hash ruins podem impactar sua tabela além de um truque que o Yahoo! usou para melhorar seu filtro de Spam.</p>
<p><a href="https://twitter.com/sergio_caelum">Sérgio Lopes</a> e <a href="http://twitter.com/alberto_souza">Alberto Souza</a> apresentaram técnicas para deixar mais rápido o carregamento das páginas Web, seguindo as diretrizes do <a href="http://developer.yahoo.com/yslow/">YSlow do Yahoo!</a>. Mostraram algumas das métricas usadas e truques para atingi-las com ferramentas Java e usando recursos do <a href="http://blog.caelum.com.br/2009/11/17/escrevendo-e-migrando-aplicacoes-para-o-google-app-engine/">Google AppEngine</a>. Ainda com relação à Web client-side, eu &#8211; <a href="http://twitter.com/anderson_leite">Anderson Leite</a> -, <a href="http://twitter.com/pmariano">Pedro Mariano</a> e <a href="https://twitter.com/cairesvs">Caires Vinicius</a> falamos sobre as <strong>novidades do HTML 5</strong>. Alguns browsers já possuem implementações do <a href="http://dev.w3.org/html5/spec/Overview.html">draft atual</a> e muitas mudanças estão sendo consideradas para essa nova versão. Entre ela as tags <strong>audio</strong> e <strong>video</strong>, a nova <a href="http://dev.w3.org/geo/api/spec-source.html">API Geolocation</a>, novas tags semânticas, novos input types, cache e <a href="http://dev.w3.org/html5/webstorage/">web storage</a>, e a tag <b>canvas</b> para <a href="http://dev.w3.org/html5/2dcontext/">desenho 2d</a>. Veja um demo de canvas e a nova JS API:</p>
<p><a href="http://andersonleite.com.br/caelum/html5.html"><img src="http://caelum.wpengine.netdna-cdn.com/wp-content/uploads/2010/05/Picture-31-300x133.png" alt="" title="clique aqui" width="300" height="133" class="aligncenter size-medium wp-image-2518" /></a></p>
<p>A <a href="http://twitter.com/cecifernandes">Cecilia Fernandes</a> apresentou <b>Do Scrum ao Lean</b>, com os próximos passos a serem tomados para uma equipe  ir do Scrum ao Lean, vantagens, desvantagens  e um exercício prático para enxergar a diferença entre a produção empurrada e puxada, alem da variação sem especialização do conhecimento.</p>
<p>Além de todas essas palestras no nosso Tech Day, muitos outros temas têm feito parte do dia a dia de estudo e inovação da Caelum. Estamos apostando fortemente no <a href="http://www.caelum.com.br/curso/fj-57-desenvolvimento-google-android/">Android</a> para o mercado Java Mobile, nas novidades do Java EE 6 para simplificar o Java corporativo (como <a href="http://www.caelum.com.br/curso/fj-25-persistencia-jpa2-hibernate/">JPA2</a> e <a href="http://www.caelum.com.br/curso/fj-26-java-web-jsf2-cdi/">JSF2</a>) e em novas iniciativas em <a href="http://blog.caelum.com.br/2010/05/14/cloud-computing-na-casa-branca-e-o-paas/">cloud computing</a> e NoSQL.</p>
<p>E você? O que tem estudado ultimamente? Quais são suas apostas?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/ultimos-aprendizados-e-inovacoes-na-caelum/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<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>Falando em Java 2009: eu fui!</title>
		<link>http://blog.caelum.com.br/falando-em-java-2009-eu-fui/</link>
		<comments>http://blog.caelum.com.br/falando-em-java-2009-eu-fui/#comments</comments>
		<pubDate>Wed, 27 May 2009 10:22:05 +0000</pubDate>
		<dc:creator>Guilherme Silveira</dc:creator>
				<category><![CDATA[Caelum]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[conferencia]]></category>
		<category><![CDATA[evento]]></category>
		<category><![CDATA[falando em java]]></category>
		<category><![CDATA[falandoemjava]]></category>
		<category><![CDATA[jim webber]]></category>
		<category><![CDATA[palestras]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[soa]]></category>

		<guid isPermaLink="false">http://blog.caelum.com.br/?p=747</guid>
		<description><![CDATA[Este domingo aconteceu o Falando em Java 2009 com mais de 500 participantes, evento que nesta terceira edição trouxe o inglês Jim Webber, arquiteto global e diretor de serviços profissionais da ThoughtWorks. Jim falou de SOA e integração e encerrou o evento dando detalhes técnicos sobre restful webservices. O próprio Jim postou a respeito do <a href="http://blog.caelum.com.br/falando-em-java-2009-eu-fui/#more-747'" class="more-link">more &#187;</a>]]></description>
			<content:encoded><![CDATA[<p style="float:right; margin:0 0 10px 15px; width:240px;">
		<img src="http://farm3.static.flickr.com/2429/3567450619_7a5d55eda3_m.jpg" width="240" />
		</p><p>Este domingo aconteceu o <a href="http://www.falandoemjava.com.br/">Falando em Java 2009</a> com mais de <strong>500 participantes</strong>, evento que nesta terceira edição trouxe o inglês <a href="http://jim.webber.name/">Jim Webber</a>, arquiteto global e diretor de serviços profissionais da <a href="http://www.thoughtworks.com/">ThoughtWorks</a>. Jim falou de SOA e integração e encerrou o evento dando detalhes técnicos sobre restful webservices. </p>
<p>O próprio Jim postou a respeito do evento <a href="http://jim.webber.name/2009/05/26/85eb97fc-c601-4103-a6bc-e0f9a0adc10c.aspx">aqui</a>, e suas palestras podem ser vistas <a href="http://jim.webber.name/presentations.html">neste link</a> (Falando em Java Keynote e Caelum Tech Talk). Jim demonstrou-se um exímio palestrante, e foi o destaque do evento. Ele também participou de nosso evento interno, o Caelum Tech Day, que ocorreu na sexta feira dentro da empresa.</p>
<p><center><br />
<a href="http://www.flickr.com/photos/silveira/3567437555/" title="_MG_8950 by Paulo Silveira, on Flickr"><img src="http://farm4.static.flickr.com/3310/3567437555_7946d372b3_m.jpg" width="240" height="160" alt="_MG_8950" /></a> <a href="http://www.flickr.com/photos/silveira/3567450619/" title="_MG_8973 by Paulo Silveira, on Flickr"><img src="http://farm3.static.flickr.com/2429/3567450619_7a5d55eda3_m.jpg" width="240" height="160" alt="_MG_8973" /></a><br />
<a href="http://www.flickr.com/photos/silveira/3567447913/" title="_MG_8962 by Paulo Silveira, on Flickr"><img src="http://farm4.static.flickr.com/3384/3567447913_78fef98615_m.jpg" width="240" height="160" alt="_MG_8962" /></a> <a href="http://www.flickr.com/photos/silveira/3568300684/" title="_MG_9010 by Paulo Silveira, on Flickr"><img src="http://farm4.static.flickr.com/3176/3568300684_8fdfa97f02_m.jpg" width="240" height="160" alt="_MG_9010" /></a><br />
</center></p>
<p>Tivemos importantes anúncios, como <a href="http://www.arquiteturajava.com.br/">o livro de Arquitetura e Design de Software: uma visão sobre a plataforma Java</a>, a futura Caelum Brasília, o <a href="http://www.caelum.com.br/curso/fj-29-aplicacoes-ricas-adobe-flex/">novo curso de Flex</a> em parceria com a pioneira <a href="http://www.dclick.com.br/">DClick</a>, além do estágio avançado do <a href="http://github.com/caelum/vraptor/tree/master">desenvolvimento do VRaptor3</a>.</p>
<p>Já existe <a href="http://guj.com.br/posts/list/127676.java">um post no GUJ discutindo como foi o evento</a> e lá você pode deixar a sua opinião. Há também muitos posts em blogs comentando, criticando, elogiando e dando sugestões em relação ao evento, por enquanto temos nos seguintes blogs: <a href="http://www.loiane.com/2009/05/falando-em-java-2009-eu-fui/">Loiane Groner</a>, <a href="http://www.rafaelcarneiro.net/blog/2009/05/25/falando-em-java-2009-eu-fui/">Rafael Carneiro</a>, <a href="http://www.jeveaux.com/blog/2009/comentarios-do-falando-em-java-09/">Paulo Jeveaux</a>,<a href="http://albertoleal.eti.br/2009/05/falando-em-java-2009-eu-fui/">Alberto Leal</a>, <a href="http://www.settech.com.br/blog/?p=86">Alberto Souza</a>, <a href="http://javawora.blogspot.com/2009/05/falando-em-java-eu-fui.html">Eduardo Bregaida</a>, <a href="http://ensinar.wordpress.com/2009/05/25/falando-em-java-nossas-impressoes/">André Pantalião e Rodrigo Ribeiro</a>, <a href="http://celodemelo.wordpress.com/2009/05/26/falando-em-java-2009/">Marcelo Madeira</a>, <a href="http://www.natanaelpantoja.com/tech/?p=248">Natanael Pantoja</a>, <a href="http://celsoavmartins.blogspot.com/2009/05/falando-em-java-2009-minhas-impressoes.html">Celso Martins</a>, <a href="http://valdemarjr.blogspot.com/2009/05/falandoemjava-2009.html">Valdemar Jr</a>, <a href="http://leandrosilva.com.br/2009/05/25/entao-falando-em-java/">Leandro silva</a>, <a href="http://www.rodrigolazoti.com.br/?p=237">Rodrigo Lazoti</a>, <a href="http://www.gonow.com.br/blog/falando-em-java">no blog da Go Now</a> e <a href="http://www.bluetalk.com.br/2009/06/12/equipe-blueeye-no-falando-em-java-2009/">da BlueEye</a></p>
<p>Confira também como foi o evento em <a href="http://blog.caelum.com.br/fatos-e-fotos-do-falando-em-java-2007/">2007</a> e em <a href="http://blog.caelum.com.br/falando-em-java-2008-eu-fui/">2008</a>! Agradecemos aos nossos patrocinadores: a <a href="http://globo.com">Globo.com</a>, <a href="http://jboss.org">o grupo JBoss </a>e a <a href="http://locaweb.com.br">Locaweb</a>. Agradecemos a todos vocês pela presença, e ficamos na certa de realizar o próximo evento ainda melhor, baseado na experiência e feedback de todos vocês!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.caelum.com.br/falando-em-java-2009-eu-fui/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>
	</channel>
</rss>

