Por que eu devo ler este artigo:Este artigo abordará as principais tecnologias para criação de web services: REST e SOAP, explicando o conceito por trás de cada uma delas e como aplicá-las em um projeto Java.

O assunto em análise será de bastante interesse para desenvolvedores que não possuem domínio sobre web services e que desejam conhecer estas opções, assim como para desenvolvedores mais experientes, que buscam compreender as diferenças e vantagens de cada uma dessas abordagens e quando adotá-las.

A comunicação entre sistemas e a capacidade de expor serviços através da Internet se tornaram uma necessidade comum para a grande maioria dos sistemas corporativos.

Seja apenas para prover suporte a outros módulos na mesma rede privada ou para permitir o acesso público a um determinado serviço, os web services são uma das tecnologias mais utilizadas tanto no Java como em outras linguagens de grande porte e fazem parte do dia a dia dos desenvolvedores.

Entre as abordagens existentes para a implementação de web services, o protocolo SOAP e o REST são as opções de maior destaque nos dias de hoje, estando presentes em grande parte das discussões relacionadas a arquiteturas orientadas a serviços na web.

Ganhando destaque no mercado do início da década de 2000, o protocolo SOAP teve grande importância em 2003, quando passou a ser uma recomendação da W3C para desenvolvimento de serviços web, sendo o padrão mais implementado na época e deixando um legado de sistemas e integrações que perdura até hoje.

O REST, por sua vez, foi desenvolvido juntamente com o protocolo HTTP 1.1 e, ao contrário do SOAP, que tem como objetivo estabelecer um protocolo para comunicação de objetos e serviços, propôs algumas ideias de como utilizar corretamente os verbos HTTP (GET, POST, PUT, HEAD, OPTIONS e DELETE) para criar serviços que poderiam ser acessados por qualquer tipo de sistema.

Sua concepção, portanto, não era de um protocolo, mas sim de um Design Pattern arquitetural para serviços expostos numa rede, como a internet, através do protocolo HTTP.

Para introduzir essas duas tecnologias, nesse artigo apresentaremos o funcionamento de ambos os métodos, explicando as principais características, vantagens e desvantagens de cada um deles e também demonstraremos como implementá-los em um projeto Java.

Além disso, apresentaremos também as boas práticas de desenvolvimento de cada uma dessas tecnologias e introduziremos situações reais em que essas soluções podem ser aplicadas, através de um exemplo a ser desenvolvido no final do artigo.

Com isso, seremos capazes de diferenciar claramente ambas as abordagens e teremos o conhecimento necessário para entender em quais cenários cada uma delas se aplica, permitindo, assim, que o leitor tenha um arsenal maior para o desenvolvimento e consumo de serviços dos mais variados formatos.

Uma breve introdução sobre web services

Web services são, por definição, serviços expostos em uma rede que permitem a comunicação entre um ou mais dispositivos eletrônicos, sendo capazes de enviar e processar dados de acordo com sua funcionalidade.

Essa comunicação, por sua vez, segue alguns protocolos, principalmente relacionados ao formato da transmissão de dados, o que permite que, uma vez que um sistema implemente essas regras, qualquer outro sistema que siga o mesmo protocolo seja capaz de se comunicar com ele.

Devido a isso, os web services se tornaram extremamente populares, pois acabaram por permitir a comunicação entre plataformas completamente diferentes (Java, C#, C++, Ruby) sem grandes esforços.

Entre essas padronizações estipuladas, as duas de maior destaque são o protocolo SOAP e o modelo de design REST, as quais iremos discutir nos próximos tópicos.

Protocolo SOAP

O protocolo SOAP, abreviação para Simple Object Access Protocol, é uma especificação para a troca de informação entre sistemas, ou seja, uma especificação de formato de dados para envio de estruturas de dados entre serviços, com um padrão para permitir a interoperabilidade entre eles.

Seu design parte do princípio da utilização de XMLs para a transferência de objetos entre aplicações, e a utilização, como transporte, do protocolo de rede HTTP.

Os XMLs especificados pelo SOAP seguem um padrão definido dentro do protocolo. Esse padrão serve para que, a partir de um objeto, seja possível serializar o mesmo para XML e, também, deserializá-lo de volta para o formato original.

Além do formato dos objetos, nesse protocolo também são definidos os padrões que os serviços SOAP devem seguir, ou seja, a especificação dos endpoints que as implementações de SOAP devem ter.

A serialização de objetos, que acabamos de descrever, tem como objetivo formar uma mensagem SOAP, composta pelo objeto denominado envelope SOAP, ou SOAP-ENV.

Dentro desse envelope existem mais dois componentes: o header SOAP, que possui informações de atributos de metadados da requisição como, por exemplo, IP de origem e autenticação; e o SOAP body, que possui as informações referentes à requisição, como o nome dos métodos que deseja se invocar e o objeto serializado que será enviado como payload da requisição.

Na Listagem 1 apresentamos um exemplo de um envelope SOAP simplificado representando uma requisição SOAP. Nele podemos identificar claramente os elementos body e header e também ter uma breve visão da sintaxe do SOAP. Dentro do body ainda se nota a descrição do método para o qual esse envelope deve ser direcionado (GetRevista) e o payload específico que foi enviado a essa função.

Listagem 1. Exemplo de um envelope SOAP que transporta um objeto com o nome "RevistaNome".


  <?xml version="1.0"?>
  <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
    <soap:Header>
    </soap:Header>
    <soap:Body>
      <m:GetRevista xmlns:m="http://www.example.org/revista">
        <m:RevistaNome>Java Magazine</m:ResvistaNome>
      </m:GetRevista>
    </soap:Body>
  </soap:Envelope>

Como verificado, não existe muito segredo no transporte de objetos através do SOAP. No caso do nosso exemplo, a requisição ao método GetRevista é enviada para o servidor juntamente com o objeto RevistaNome, que servirá de parâmetro de entrada ao nosso método e tem, como conteúdo, a String “Java Magazine”. Ao chegar ao servidor, ...

Quer ler esse conteúdo completo? Tenha acesso completo