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






Ótimo post. Só um pequeno detalhe que acho que passou batido, a maior diferença é conceitual e não tecnológica, em SOA você modela pensando em serviços (ações) e REST modela no que está se chamando de ROA, ou seja baseado nos recursos em si, sendo as ações reprentadas pelos verbos HTTP (GET, PUT, POST, DELETE). Do ponto de vista técnico as diferenças são poucas, REST usa tudo que já tem pronto de HTTP, ou seja pra fazer cache tem o mod_proxy do apache (ou o squid) enquanto WS tem seus modos fazer cache, por outro lado WS tem extensões de autorização, enquanto o REST não (mas tem a autenticação com HTTP “de graça”), mas nada impede de implementar o que existe em um no outro.
Como sempre discute-se o menos importante, mesmo pq comparar REST (ou melhor ROA) com SOA é quase como comparar laranjas com maçãs, um é modelagem baseado em serviços enquanto o outro é em recursos.
Boa Edgard, realmente você está certo, complementou muito bem o tópico.
Gostei muito deste post. Parabéns. Talvez me possa ajudar, estou neste mundo de J2EE há pouco tempo mas tenho grandes responsabilidades na empresa onde trabalho. Neste momento estou a investigar como poderei expor um catálogo de serviços para a internet que já tenho a funcionar na intranet, para isso preciso de implementar segurança! Se puder me indicar uns links de boa leitura, agradeço!
Acácio, quando vc diz catálogo de serviços, vc está falando de Web Services, certo?
Se for esse caso, você quer expor esses serviços para que apenas determinadas pessoas acessem? Se você puder detalhar isso um pouco melhor, fica mais fácil ajudar…
Abs!
Sim estamos a falar de ter vários webservices. Hoje tenho alguns que são comsumidos internamente. Usamos axis2. Agora como quero expor para fora da empresa, nomeadamente, para a internet, a segurança para a ser uma grande preocupação.
Poderei usar o https como solução ?
Será correcto pedir login e password a cada invocação que um cliente faça de um WS?
Olá Acácio,
Sim, você poder usar HTTPS, mas a única coisa que o HTTPS vai te garantir é que os dados entre o cliente o serviço estarão criptografados, porém se o serviço estiver exposto para toda internet, nada impede que qualquer um possa acessá-los.
Você pode resolver o problema do acesso de algumas maneiras, uma é solicitar login/senha, outra é só permitir chamadas de determinado IP (caso exista essa possibilidade).
No formato que você está usando os seus serviços, no caso WS-* (SOAP/WSDL), você deve usufruir da especificação WS-Security, que é um padrão de segurança para Web Services.
Aproveitando, eu te indicaria reconsiderar a possibilidade de usar outro framework sem ser o Axis, recentemente usamos na minha empresa o Axis2 e tivemos uma série de problemas em ambiente de produção, fora que esse negócio de gerar stubs/xml beans com o Axis tb não é muito prático, estamos usando o Spring-WS que tem um formato um pouco diferente (contract-first) do que o Axis (contract-last), mas é bem mais estável, tem uma ótima documentação e é mais prático, só tem uma curva de aprendizado maior.
Abaixo alguns links:
Spring-WS Security
http://static.springframework.org/spring-ws/sites/1.5/reference/html/security.html
WS-Security
http://www.ibm.com/developerworks/webservices/library/ws-security.html
http://www.guj.com.br/posts/list/44941.java
Segurança no Axis
http://ws.apache.org/axis/java/security.html
Só para fazer um adendo: caso você opte por usuário/senha, não será necessário enviar usuário e senha em toda requisição, existe algumas maneiras de fazer isso, como autenticação com SSO, Username Token Profile, Geração de Keys, fora que você pode manter estado entre as chamadas (stateful) evitando que essas informações devam ser passadas toda chamada.
Bem, é isso, abraço e boa sorte :)
Um grande muito obrigado pela sua resposta!
Realmente temos tido alguns problemas com o nosso tomcat em produção desde que usamos o Axis2 e andamos a desconfiar que é disso.
De qualquer forma, estamos apostados em evoluir a nossa framework cada vez mais em Spring, para desenvolvermos webapps. Não tinha pensado em usar WS em Spring, mas como me está a recomendar, vou estudar seriamente essa hipótese.
Em relação à segurança, acho que, depois da sua resposta, estou mesmo muito perto da minha solução, porque o meu WS que vou expor pede sempre login e password, e não faz nada, sem primeiro autenticar (usa o casclient) e depois autorizar (usa um sistema proprietário nosso de perfis). Assim, se eu expor o WS por https, já o login e password viajam encriptados e com isto, estou lançado..
Gostaria de obter, se possível, as referências que você se baseou para elaborar este artigo. É para o meu trabalho final de conclusão.
Desde já agradeço.
Meu e-mail é gilton_nasc@yahoo.com.br, caso queira enviar as referências.
Mais uma vez, obrigado pela atenção e pelo artigo, parabéns!!
Gilton,
Na verdade as referências são mais a minha experiência e o que eu leio do que qualquer outra coisa hehe, mas se você procurar no Google pelos assuntos citados no post, vc acha bastante referência boa.
Se você precisar de alguma coisa e eu puder ajudar, pode contar comigo.
Abs,
Marcus parabéns pelo artigo :-)
Parabéns pelo artigo, muito bem ponderado, sem “religiosidade” e focado na prática. Estou finalizando um artigo para o MBA sobre este assunto e as conclusões que tirei são bem próximas.
Um abraço!
Valeu Danilo, obrigado!
Que bom saber que o que está escrito nesse post está tão próximo das questões que você estudou para seu MBA.
Depois, se for possível, disponibiliza conosco esse seu artigo :)
Me desculpe, mas discordo de várias coisas que você colocou aqui. Entre elas:
1 – UDDI é pouquíssimo usado. Eu nunca o colocaria como uma vantagem, nem como algo positivo.
2 – Fazer POST em um formulário implica em usar HTTP, mas está longe de significar uma arquitetura RESTFul.
3 – Requests/Responses REST não são infinitamente menores. São menores, mas a ordem de grandeza é pequena. Essa diferença de tamanho só representará uma diferença realmente relevante se houver um throughput de rede bem alto.
4 – A quantidade de especificações que o desenvolvedor precisa conhecer não faz com que uma tecnologia seja mais “humana” que a outra.
5 – De onde você tirou que “Serviços REST também não permitem requisições assíncronas”? Isso tá MUITO errado.
Não leve a mal minhas observações, o objetivo é que sejam construtivas.
Fala Bruno!
Que isso cara, de forma nenhuma levei a mal, a idéia é justamente reunir conteúdo que agregue e se realmente eu estiver errado, não vejo problema algum em afirmar isso e alterar o post. Mas vamos lá ao que você disse:
1) De fato UDDI não é TÃO usado, apesar de sua idéia ser bem interessante (para quem não conhece é como se fosse aquela listas de telefone, só que para webservices). Mas não é só pelo fato de UDDi não ser TÃO usado, que podemos desconsiderar algumas vantagens de web services WS-* em relação a web services REST, certo? E também não é só pq ele é usado que devemos ignorar a sua existência e sua utilildade, O XMLHTTP (o famoso ajax) por exemplo, já existia há um bom tempo e só foi ser usado efetivamente de 3 anos pra cá. Sem contar que um dos pilares de SOA é “permitir que serviços sejam descobertos”, baseado em SOA, UDDI é importante. Mas tem gente que usa sim: http://registry.gbif.net/uddi/web
2) Eu não afirmei que fazer POST em um formulário vc está usando uma ARQUITETURA RESTful, eu disse que ao fazer um POST em um formulário indiretamente você está usando REST, afinal no seu conceito mais puro REST diz “… onde o usuário progride com uma aplicação selecionando as ligações (transições do estado), tendo como resultado a página seguinte (que representa o estado seguinte da aplicação) que está sendo transferida ao usuário e apresentada para seu uso.”
Mas está longe de ser uma arquitetura REST, talvez eu tenha me expressado mal, se eu tivesse citado que quando você acessa uma página você está usando REST (afinal o maior exemplo de uma arquitetura REST é a web) seria melhor do que o exemplo do POST.
3) A questão da ordem de grandeza acho que não é discutível. O que vale considerar é que se você tiver uma aplicação que acessa serviços (resquests/responses) o tempo todo no final das contas o somatório de bytes desses requests/response será BEM menor no caso de você ter usado REST ou de você ter usado SOAP.
4) Ah não? Então você está me dizendo que você conhecer todos as especificações de WS-* é tão prático e fácil do que conhecer como funciona uma arquitetura RESTful? Você consegue gerar um WSDL na mão? Sem IDE?
5) Sim, estou MUITO errado, concordo :) Existem maneiras de se fazer isso. Com COMET, por exemplo, mas você há de concordar que não é algo tão usado sim, existem maneiras, mas não existe um consenso.
E fique a vontade para fazer suas observações, a idéia é debatermos e aprendendermos, eu por exemplo já aprendi algumas coisas com suas observações :)
Abraço!
Ótimo artigo!
Na minha opinião decidir qual arquitetura de ws utilizar depende muito do escopo do projeto, cliente e quem irá desenvolver tais funcionalidades.
Parabéns pelo blog.
abcs,
Valeu Cristiano!
Concordo com o que você afirma, é exatamente o que eu quis passar com o post :)
[]s