<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://arquitecturadesoftware.tejo.servers.paisbatista.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>António Cruz : AJAX, SOA</title><link>http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/AJAX/SOA/default.aspx</link><description>Tags: AJAX, SOA</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.2)</generator><item><title>JSON Power(ed) II</title><link>http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx</link><pubDate>Mon, 31 Jul 2006 22:01:00 GMT</pubDate><guid isPermaLink="false">f91c5163-993a-4ad3-b0c6-9418870e089f:429</guid><dc:creator>António Cruz</dc:creator><slash:comments>2</slash:comments><comments>http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/comments/429.aspx</comments><wfw:commentRss>http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/commentrss.aspx?PostID=429</wfw:commentRss><wfw:comment>http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/rsscomments.aspx?PostID=429</wfw:comment><description>&lt;P&gt;Há já algum tempo que penso nas implicações do uso das técnicas&amp;nbsp;denominadas de AJAX nas arquitecturas service-oriented. Neste post, vou&amp;nbsp;partilhar alguma da experiência conseguida entretanto. &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Cenário&lt;/STRONG&gt;:&amp;nbsp;Necessitamos de&amp;nbsp;pesquisar a base de&amp;nbsp;dados de&amp;nbsp;uma&amp;nbsp;aplicação já&amp;nbsp;em produção de forma a&amp;nbsp;apresentarmos a informação&amp;nbsp;com HTML, num&amp;nbsp;browser.&amp;nbsp;A aplicação apenas&amp;nbsp;disponibiliza feeds de RSS, permitindo pesquisar a base de dados e paginar os resultados mediante parâmetros em querystring. Não é viável proceder a alterações na aplicação pelo que se prefere uma solução que não implique fazer alterações ao código existente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Solução&lt;/STRONG&gt;:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;a) Usar o HTML DOM para navegar o XML do RSS e ir construindo dinamicamente os&amp;nbsp;elementos e atributos&amp;nbsp;de HTML de que necessitamos para apresentar a informação. Apesar de dar bastante trabalho, esta abordagem tem a vantagem de ser cross-browser e não possuir dependências externas;&lt;/P&gt;
&lt;P&gt;b)&amp;nbsp;Usar XSLT&amp;nbsp;em client-side (fazendo transformações no browser).&amp;nbsp;Recorrendo a uma livraria como&amp;nbsp;a&amp;nbsp;&lt;A href="http://sarissa.sourceforge.net/doc/overview-summary.html"&gt;Sarissa&lt;/A&gt;,&amp;nbsp;será fácil transformar em HTML os RSS devolvidos pelo servidor. Também é possível usar o&amp;nbsp;XSL&amp;nbsp;para transformarmos o RSS em&amp;nbsp;JSON (e a partir daí construír a apresentação).&amp;nbsp;&lt;A href="https://json-xslt.codebase.ebay.com/"&gt;Este .xsl&lt;/A&gt;&amp;nbsp;faz uma transformação genérica de XML para JSON, embora eu tenha detectado problemas com atributos e&amp;nbsp;aparentemente as&amp;nbsp;secções de CDATA não são suportadas;&lt;/P&gt;
&lt;P&gt;c) Usar&amp;nbsp;um broker, isto é, uma aplicação server-side que receba os pedidos que se destinam à aplicação&amp;nbsp;de RSS e faça forward destes para essa aplicação. Porque todos os pedidos (e respectivas respostas) passam pelo broker, é fácil proceder à transformação das respostas em HTML (ou outro formato).&lt;/P&gt;
&lt;P&gt;Na minha opinião, a melhor hipótese é a c). Aqui ficam as razões da escolha:&lt;/P&gt;
&lt;P&gt;-&amp;nbsp;O uso do &lt;A href="http://patternshare.org/default.aspx/Home.PP.Broker"&gt;padrão de&amp;nbsp;brokering&lt;/A&gt; é pelo menos&amp;nbsp;bastante recomendado (pessoalmente, acho obrigatório)&amp;nbsp;em&amp;nbsp;arquitecturas service-oriented. O &lt;EM&gt;decoupling&lt;/EM&gt;&amp;nbsp;decorrente da "intercepção" dos pedidos é só por si, razão suficiente para justificar a sua adopção, mas muitas outras vantagens são obtidas a partir da sua implementação.&lt;/P&gt;
&lt;P&gt;-&amp;nbsp;Embora não comparável&amp;nbsp;ao leque de serviços oferecido por um &lt;A href="http://en.wikipedia.org/wiki/Enterprise_Service_Bus"&gt;ESB&lt;/A&gt;, um broker simples traz a vantagem de que tanto os clientes como os serviços não têm de se preocupar com os formatos dos respectivos pedidos e respostas: o problema das traduções pode sempre ficar a cargo do broker (v. o resto da solução).&lt;/P&gt;
&lt;P&gt;Assumindo que optámos pelo broker,&amp;nbsp;enuncio&amp;nbsp;mais algumas&amp;nbsp;hipóteses:&lt;/P&gt;
&lt;P&gt;a) Usar um elemento de&amp;nbsp;&amp;lt;script&amp;gt;&amp;nbsp;estático que incluímos na&amp;nbsp;página, cuja propriedade&amp;nbsp;&lt;EM&gt;src&lt;/EM&gt; aponta para o broker. O broker pode&amp;nbsp;fazer a transformação do RSS para JSON usando qualquer linguagem em server-side (não precisa de ser XSLT, pode ser C#, Java, PHP, etc.). Para um exemplo de código que produz JSON a partir de XML usando C#, podem ver &lt;A href="http://www.phdcc.com/xml2json.htm"&gt;aqui&lt;/A&gt;. O único problema que até agora encontrei neste código foi o facto de&amp;nbsp;(também)&amp;nbsp;não suportar CDATA. Mas&amp;nbsp;foi simples fazer uma alteração para suportar esse elemento e neste momento tenho uma versão que suporta CDATA, atributos, arrays, etc.&amp;nbsp;(se alguém estiver interessado nesta versão basta fazer um post).&lt;/P&gt;
&lt;P&gt;b) Usar o objecto HTTPRequest para fazer&amp;nbsp;o pedido, embora neste caso ficamos sujeitos às &lt;A href="http://developer.yahoo.com/javascript/howto-proxy.html#why"&gt;restrições de pedidos cross-domain&lt;/A&gt; (a propósito, acho que devia chamar-se &lt;EM&gt;cross-server&lt;/EM&gt;, porque não basta estarmos no mesmo domínio para funcionar). Uma solução para isto (mais uma vez)&amp;nbsp;usar um broker no mesmo servidor da aplicação. Esta abordagem tem apenas o problema de termos que ter um broker a fazer de &lt;EM&gt;&lt;A href="http://en.wikipedia.org/wiki/Reverse_proxy"&gt;reverse proxy&lt;/A&gt;&lt;/EM&gt; em cada uma das aplicações que pretendemos consumir (caso fossem várias);&lt;/P&gt;
&lt;P&gt;c) Usar um elemento &amp;lt;script&amp;gt;, tal como descrito em a), mas criado dinamicamente, usando o HTML DOM. Para um exemplo da criação dinâmica, podem consultar &lt;A href="http://www.xml.com/pub/a/2005/12/21/json-dynamic-script-tag.html"&gt;este artigo&lt;/A&gt;. De notar que também&amp;nbsp;neste caso&amp;nbsp;é um pressuposto que&amp;nbsp;o JSON seja criado no servidor;&lt;/P&gt;
&lt;P&gt;d) Para os casos em que hajam &lt;EM&gt;muitos&lt;/EM&gt; pedidos concorrentes ao servidor, o facto de serem feitas transformações de&amp;nbsp;XML para JSON pode revelar-se problemático, devido ao &lt;EM&gt;overhead&lt;/EM&gt; introduzido pelas transformações. Neste caso, sugiro usarem a abordagem descrita em c)&amp;nbsp;para devolverem apenas o RSS encapsulado numa propriedade de um objecto de JSON e proceder à sua transformação para JSON, mas no cliente. Vamos ganhar com isto que a carga das&amp;nbsp;transformações de XML para JSON são distribuídas por cada cliente, ficando o broker com a carga mínima de criar uma string que apenas contém o RSS pretendido. Para uma implementação de conversões entre XML e JSON usando JavaScript, podem ver &lt;A href="http://goessner.net/download/prj/jsonxml/"&gt;aqui&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Face ao exposto,&amp;nbsp;considerem que em alguns casos, não faz grande sentido desenvolvermos&amp;nbsp;XML Web Services&amp;nbsp;que sejam compatíveis com o &lt;A href="http://www.ws-i.org/Profiles/BasicProfile-1.1.html"&gt;Basic Profile 1.1&lt;/A&gt; da &lt;A href="http://www.ws-i.org/"&gt;WS-I&lt;/A&gt;, etc.&amp;nbsp;Se&amp;nbsp;a complexidade de o fazer é superior ao benefício alcançado, então a melhor&amp;nbsp;opção pode encontrar-se num mero... RSS (no entanto, a opção de usar&amp;nbsp;JSON&amp;nbsp;em vez de&amp;nbsp;XML também traz várias condicionantes conhecidas como ausência de schema&amp;nbsp;que permita a&amp;nbsp;validação das mensagens, ausência de contrato automatizável como o WSDL, etc.).&lt;/P&gt;
&lt;P&gt;Penso que a abordagem descrita em d) condensa a melhor abordagem possível em termos da&amp;nbsp;arquitectura Web 2.0 num cenário SOA, conforme o que ficou descrito. Também penso ter demonstrado o interesse (e&amp;nbsp;actualidade) de pensarmos&amp;nbsp;em que termos&amp;nbsp;a Web 2.0 condiciona/potencia as arquitecturas service-oriented e a arquitectura de software de um modo geral.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;;subject=JSON+Power(ed)+II" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;;title=JSON+Power(ed)+II" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;title=JSON+Power(ed)+II" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;;title=JSON+Power(ed)+II" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx&amp;amp;;title=JSON+Power(ed)+II&amp;amp;;top=1" target="_blank" title = "Post http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/2006/07/31/429.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://arquitecturadesoftware.tejo.servers.paisbatista.com/aggbug.aspx?PostID=429" width="1" height="1"&gt;</description><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/SOA/default.aspx">SOA</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/Best+Practices/default.aspx">Best Practices</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/ESB/default.aspx">ESB</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/AJAX/default.aspx">AJAX</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/JSON/default.aspx">JSON</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/Web+2.0/default.aspx">Web 2.0</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/Arquitectura/default.aspx">Arquitectura</category><category domain="http://arquitecturadesoftware.tejo.servers.paisbatista.com/blogs/antoniocruz/archive/tags/MSDN+Portugal/default.aspx">MSDN Portugal</category></item></channel></rss>