Skip to content


WebServicesREST – Criação de clientes Java para os serviços REST

Criação de clientes Java para os serviços REST

Expusemos com bom nível de detalhe a implementação de serviços REST do lado do servidor. Para permitir uma visão completa da comunicação, é muito importante falar também de clientes RESTful.

Uma vez que já temos o protocolo estabelecido, o papel do cliente é manipular as solicitações e respostas no formato acordado com o servidor. Para exemplificar como pode ser feito isso do lado do cliente, apresentamos na listagem abaixo a classe OfertaTestREST, que realiza uma solicitação para cadastro de uma oferta sobre um item. O código deste teste foi feito para facilitar a ilustração do que está sendo feito. Este é o motivo de imprimir os cabeçalhos e corpo tanto da requisição como da resposta HTTP.

public class OfertaTestREST extends TestCase {
 
public void testCadastro() throws HttpException, IOException{
// Criamos o usuário
Usuario usuario = new Usuario();
usuario.setNome("Usuario Artigo");
usuario.setEmail("usuario@test.com");
usuario.setLogin("artigo" + System.currentTimeMillis());
UsuarioService usuarioService = ServiceFactory.getUsuarioService();
usuario = usuarioService.cadastrar(usuario);
 
// Criamos o item
Item item = new Item();
item.setDescricao("Item teste Artigo " + System.currentTimeMillis());
item.setNome("Iphone");
item.setNovo(true);
item.setValorInicial(new BigDecimal(0));
item.setVendido(false);
ItemService itemService = ServiceFactory.getItemService();
item = itemService.cadastrar(item, usuario);
 
// E agora a criação da Oferta de maneira RESTFul
Oferta oferta = new Oferta();
oferta.setDataModificacao(new Date());
oferta.setItem(item);
oferta.setOfertante(usuario);
oferta.setValor(new BigDecimal(111.22).setScale(2, RoundingMode.HALF_UP));
 
// Montando requisição com o commons-http-client
HttpClient client = new HttpClient();
PostMethod method = new PostMethod("http://localhost:8080/item/" + item.getCodItem() + "/ofertas");
 
// Geração de XMLs com o XStream
XStream xstream = new XStream();
xstream.alias("oferta", Oferta.class);
xstream.alias("ofertante", Usuario.class);
xstream.alias("item", Item.class);
String ofertaXml = xstream.toXML(oferta);
System.out.println(ofertaXml);
 
// Definindo corpo da requisição
StringRequestEntity requestEntity = new StringRequestEntity(ofertaXml, "text/xml", "UTF-8");
method.setRequestEntity(requestEntity);
 
// Here it goes...
int statusCode = client.executeMethod(method);
 
// Status HTTP deve ser 201 - Created
assertEquals(HttpServletResponse.SC_CREATED, statusCode);
 
System.out.println("\n#### REQUISIÇÃO ####\n");
System.out.println(method.getName() + " " + method.getPath());
Header[] headersRequest = method.getRequestHeaders();
for(Header header : headersRequest){
System.out.println(header.getName() + " : " + header.getValue());
}
 
method.getRequestEntity().writeRequest(System.out);
System.out.println("\n\n#### RESPOSTA ####\n");
System.out.println(method.getStatusLine().getHttpVersion() + " " + method.getStatusLine().getStatusCode());
 
Header[] headersResponse = method.getResponseHeaders();
for(Header header : headersResponse){
System.out.println(header.getName() + " : " + header.getValue());
}
 
System.out.println(method.getResponseBodyAsString());
}
}

O formato da requisição HTTP gerada por esta classe pode ser visto na primeira listagem abaixo. Na listagem seguinte pode ser conferido o formato da resposta HTTP a esta solicitação. A terceira listagem desta sequência mostra o formato da resposta à busca de ofertas de um determinado item.

#### REQUISIÇÃO ####
POST /item/13c017ba-7c01-44aa-9a0b-b815a9ea298f/ofertas
User-Agent : Jakarta Commons-HttpClient/3.0.1
Host : localhost:8080
Content-Length : 596
Content-Type : text/xml; charset=UTF-8
<oferta>
  <valor>111.22</valor>
  <dataModificacao>2008-09-28 10:36:54.642 BRT</dataModificacao>
  <item>
    <codItem>13c017ba-7c01-44aa-9a0b-b815a9ea298f</codItem>
    <nome>Iphone</nome>
    <descricao>Item teste Tech Talk 1222609014628</descricao>
    <valorInicial>0</valorInicial>
 
    <novo>true</novo>
    <vendido>false</vendido>
  </item>
  <ofertante>
    <codUsuario>fc6104ad-b9a5-4b2d-9085-a186083b9c2d</codUsuario>
    <nome>Usuario Tech Talk</nome>
    <login>techtalk1222609014475</login>
    <email>usuario@test.com</email>
  </ofertante>
  <vencedora>false</vencedora>
</oferta>
#### RESPOSTA ####
 
HTTP/1.1 201
Server : Apache-Coyote/1.1
Location : http://localhost:8080/item/13c017ba-7c01-44aa-9a0b-b815a9ea298f/ofertas
Content-Length : 0
Date : Sun, 28 Sep 2008 13:36:55 GMT

A implementação das solicitações HTTP em Java pode ser feita com uso da biblioteca commons-http-client. Esta API permite que montemos requisições HTTP e recebamos suas respostas correspondentes, da mesma forma que ocorreria com um browser simples. Não existe a capacidade de executar código javascript e também não existem equivalentes para os plugins dos browsers completos. Mesmo sem estes recursos, o commons-http-client nos dá o poder de fazer praticamente qualquer operação padrão HTTP do lado cliente. Isto torna esta biblioteca um componente de fundamental importância para implementações RESTful feitas em Java.

AnteriorÍndicePróxima


8 Responses

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Felipe Gaúcho says

    Conteúdo muito bom, mas me chamou a atenção o uso do XStream. O JAXB já está instalado na máquina do cliente, portanto usar XStream me parece adicionar uma dependência sem ganho aparente em desempenho ou qualidade da solução.

    Se eu puder sugerir uma melhoria, sugiro o JAXB no lugar o XStream, reduzindo o número de dependências do projeto.

    Outro detalhe que senti falta foi o XSD Schema do meta-dado e a validação do XML de entrada e saída das operações… Mesmo considerando que temos o controle nas duas pontas (cliente e servidor), a validação é sempre recomendada, e melhor ainda se a validação incluir handlers para a validação de regras negócios – o que existe por default no JAXB.

  2. Felipe Gaúcho says

    esta linha, por exemplo: oferta.setValor(new BigDecimal(111.22).setScale(2, RoundingMode.HALF_UP));

    sugere que o valor esperado pelo servidor tem duas casas decimais e é do tipo “xsd:long”, mas no código cliente apresentado fica impossível detectar isso.. além disso, se o contrato (WADL) no servidor for alterado, alguém terá de atualizar esta linha de código e nem sempre isso é de fácil detecção no caso de meta-dados com muitos atributos.

  3. blpsilva says

    Oi Felipe, ótimas observações mesmo. Sobre o uso do JAXB x XStream, eu normalmente uso o JAXB quando posso usar JDK 1.5 e XStream para JDK 1.4/1.3. O JAXB 2.0 exige JDK 1.5, o que infelizmente só está disponível em parte das aplicações lá no trabalho.

    Sobre as validações dos XMLs, não fazemos por XML Schema como é feito em SOAP. Como temos o server e fornecemos o client para as aplicações, o client sempre “confia” que os dados do servidor são válidos.

    Já o servidor valida todos os dados enviados pelos clientes, e retorna as mensagens de erro detalhadas. Atualmente fazemos essas validações com o Hibernate Validator, mas não tem nenhum motivo especial para isso ter sido feito com ele não. Foi questão só de familiaridade mesmo.

  4. blpsilva says

    Outra coisa, eu pretendo escrever outros artigos especificamente de JAXB e XStream, só que resolvi publicar esse artigo mesmo ainda não tendo os outros. Daqui a algumas semanas pretendo adicionar esses outros, aí fica mais completo :)

  5. Gabriel says

    Fala Bruno,

    Primeiramente queria parabenizar ai pelo artigo e dizer que tem gente aqui em SC que aprecia o teu trabalho =)

    Bom, eu também trabalho com integração de sistemas e ao meu ver o ponto fraco do REST seria essa falta de validação das mensagens de emtrada, como falou o Felipe Gaucho. Quando você trabalha com integração entre 2 sistemas que foi você quem fez ambos, você realmente pode “confiar” que os dados vão chegar corretamente. Mas na vida real nem sempre acontece desta maneira, e nos deparamos com situações em que essa validação é realmente necessária. Minha pergunta, esta validação é contra os princípios do REST, pois pode acabar tendo toda a burocracia dos padrões WS-*, ou ela pode ser feita sem problemas?

  6. blpsilva says

    @Gabriel

    Fico feliz de saber que tem gente de SC que me conhece, e saiba que eu tenho muita vontade de conhecer sua terra :)

    A respeito das validações, você pode validar tanto quanto julgar necessário. Caso você tenha controle sobre todas as aplicações que se comunicam, você pode validar um pouco menos se quiser, mas isto é totalmente decisão sua.

    Normalmente em serviços SOAP, sua pilha de web services fará automaticamente a validação dos dados enviados, comparando-os com os schemas XML declarados no WSDL. Quase sempre este é o padrão, então se você estiver usando SOAP, você provavelmente já terá “de graça” a validação dos schemas XML. As validações de regras de negócio serão feitas dentro da implementação dos web services, e este tipo de validação pode ser feito de qualquer forma que você queira.

    Em termos de validações, com REST você PODE fazer todas as validações feitas em serviços WS-*, e validar muito mais coisa. Isto não é especificado e não é nem contra nem a favor de nenhum princípio de REST. A diferença é que você não é OBRIGADO a validar nada, e nem mesmo OBRIGADO a ter schemas XML. O correto é analisar os requisitos e utilizar o nível de formalidade que for mais coerente para a situação.

    []s

  7. Roan says

    Bruno,

    Essa classe que ele extende de TestCase é o que? Um JUnit?

  8. Rafael de Oliveira Lima says

    Bruno muito obrigado por compartilhar essas informações conosco, eu estava precisando realização um conexão com servidor rest com uma aplicação usado java 1.4 e seu foi essensial no termino do meu trabalho….
    Muito obrigado.



Some HTML is OK

or, reply to this post via trackback.



  • Buy Cheap xanax recreational use Now The Largest Internet Pharmacy. Best Online.
  • Buy Cheapest insomnia medication prescription Online Drugs, Health And Beauty. Best Internet.
  • Buy Cheapest drugs online Now Low Prices. Discount Pharmacy Online.
  • Buy Cheap pharmacies and prescriptions for pain meds Online No Prescription Needed. Best Prices.
  • Buy Cheapest buy depo medrol Online Best Prices. Internet Prices For buy depo medrol!
  • Buy Cheapest names of prescription pain medications Now Best Drugstore. Cheap Online Pharmacy.
  • Buy Cheapest cialis profestional Online Online Medical Shop. Pharmacy Store.
  • Buy Cheap buy cialis cialas Online Best Drugstore. Online Medical Shop.
  • Buy Cheap health med Now 100% Satisfaction Guaranteed. Pharmacy Store.
  • Buy Cheap on line pharmacies Online Online Prices For on line pharmacies! Best Prices.
  • Buy Cheap consumer proven weight loss medication Online Discount Online Pharmacy. Best Internet.
  • Buy Cheap drugs to treat depression Online Special Prices For drugs to treat depression! Best Online.
  • Buy Cheap medicin depression buy Online 24/Internet)(safe Pharmacy. Best Prices.
  • Buy Cheapest antidepressant purchase france Now Pharmacy At The Best Price! Best Online.
  • alprazolam overdose Online Without Prescription Free Viagra Pills! Best Prices.
  • Buy Cheapest cialis free trials Online Best Internet. WorldWide Shipping.
  • Buy Cheapest belly fat diet pill Online Best Online. Online Prices For belly fat diet pill!
  • Buy Cheapest prescription drugs on internet Online Discount Pharmacy Online. Best Online.
  • Buy Cheapest cheap overseas pharmacies Now Pharmacy At The Best Price! Best Online.
  • Buy ambien purchase Without Prescription Doctor. Pharmacy Store. Low Prices.
  • Buy Cheap spain farmacia levitra Online Online Medical Shop. Cheap Online Pharmacy.
  • Buy Cheapest what is viagra super active Now Top Online Pharmacy. Cheap Pharmacy Online.
  • Buy Cheap overdose of xanax Online Online Medical Shop. Pharmacy Store.
  • Buy Cheap impotence drugs Online Best Online. Internet Prices For impotence drugs!
  • Buy Cheap buy narcotic pain relievers Now Discount Online Pharmacy. WorldWide Shipping.
  • Buy Cheapest phentermine online without doctor orders Now Pharmacy Store. Buy Medications Online.
  • Buy Cheapest generic name viagra Now Pharmacy At The Best Price! Pharmacy Store.
  • Buy Cheapest cheap priced valium Online Guaranteed Shipping. Pharmacy Store.
  • Buy Cheapest buy sleep aids on line Online Best Prices. Discount Online Pharmacy.
  • Buy Cheap viagra drug interactions Online Guaranteed Shipping. WorldWide Shipping.
  • Buy Cheap cheap sarafem Now The Largest Internet Pharmacy. Best Online.
  • Buy Cheap phentermine 30mg Now Cheap Meds Without Prescription. Best Online.
  • Buy Cheap valium dosage Now Guaranteed Shipping. Online Prices For valium dosage!
  • Buy Cheap pain pill withdrawals Online No Prescription Needed. Best Online.
  • Buy Cheap cialis for erection Now Special Prices For cialis for erection! Best Internet.
  • Buy Cheap weight loss doctor online Now Bonus Pills And Reorder Discounts! Low Prices.
  • Buy Cheapest levitra website Online Guaranteed Shipping. Pharmacy Store.
  • Buy Cheap free samples cialis Online Best Internet. Cheap Prescription Drugs.
  • Buy Cheapest maximum fat loss Online WorldWide Shipping. Pharmacy Store.
  • Buy Cheap tadalafil jelly Online Discount Online Pharmacy. Best Prices.
  • how to buy impotence medication Online Without Prescription Best Drugstore. Low Prices.
  • Buy Cheap prescription weight loss meds online Now Guaranteed Shipping. Top Online Pharmacy.
  • Buy Cheapest cheap femara Online Pharmacy Store. No Prescription Needed.
  • Buy Cheap viagra size Online Best Online. Top Online Pharmacy Supplier.
  • Buy Cheap vardenafil hcl Online Pharmacy At The Best Price! Best Drugstore.
  • Buy Cheapest prescription for chlamydia Now Free Viagra Pills! Cheap Pharmacy Online.
  • Buy Cheapest cialis flagstaff Online Free Viagra Pills! Pharmacy Store.
  • Buy Cheapest valium generic Online Guaranteed Shipping. Best Online.
  • Buy Cheapest cheap diet pills online Now Best Online. Online Prices For cheap diet pills online!
  • Buy Cheapest weight loss medicine buy online Now We Can Offer You Visit Our Online Pharmacy.
  • Buy Cheap curing impotence Online Order Cheap Meds Without Rx. Best Online.
  • Buy Cheapest stronger pain killer Now Free Viagra Pills! No Prescription Needed.
  • Buying Cheap india pharmacy. Offshore Rx, Good Prices. Guaranteed Shipping.
  • Buy Cheapest order ampicillin Now Internet Prices For order ampicillin! Best Drugstore.
  • Buy order quality cialis Online Without Prescription. Best Online. Low Prices.
  • Buy Cheap accutane before after Now No Prescription Needed For Drugs. Best Prices.
  • Buy Cheapest side effects of ambien 10 mg Online Cheap Pharmacy Online. Low Prices.
  • Buy Cheapest original cialis Now No Prescription Needed. Free Viagra Pills!
  • Buy Cheapest xanax 2 mg no prescription Now Top Online Pharmacy. WorldWide Shipping.
  • Buy does zyban work Online Without Prescription. Pharmacy Store. Low Prices.
  • Buy Cheapest viagra alcohol Now Special Prices For viagra alcohol! Best Drugstore.
  • Buy Cheapest lexapro for anxiety Online 24/Online Pharmacy. Low Prices.
  • Buy Cheapest viagra for recreational use Now Buy Medications Online. WorldWide Shipping.
  • Buy Cheapest diazepam us pharmacy Online Drugs, Health And Beauty. Low Prices.
  • Buy Cheap how to take viagra Now 24/Online Pharmacy. WorldWide Shipping.
  • Buy Cheapest viagra canada satisfaction guarantee Online Drugs, Health And Beauty. Best Internet.
  • Buy Cheapest mexican cialis Online Drugs, Health And Beauty. Best Internet.
  • Buy Cheapest drug ambien Now Cheap Pharmacy Online. WorldWide Shipping.
  • Buy Cheapest prescribed weight loss medication Now Free Viagra Pills! Cheap Pharmacy Online.
  • Buy Cheap best price for cialis Online Internet Prices For best price for cialis! Low Prices.
  • Buy Cheapest levitra pill size Online Low Prices. Buy Medications Online.
  • Buy cvs drug stores Without Prescription Doctor. Low Prices. Best Internet.
  • Buy Cheap promethazine tablets Now Best Online. Safe And Secure Payment System.
  • Buy Cheap online consultation xanax Online Pharmacy Store. Top Online Pharmacy.
  • Buy Cheap lorazepam withdrawal symptoms Online Best Prices. Drugs, Health And Beauty.
  • Buy Cheapest ultram ultracet Online No Prescription Needed. Low Prices.
  • Buy Cheapest fast weight loss Now Best Online. 100% Satisfaction Guaranteed.
  • Buy Cheapest drugs for depression Now Best Internet. Buy Medications Online.
  • Buy Cheapest valium recreational Online Best Online. Online Prices For valium recreational!
  • Buy Cheapest cialis low dose Now Buy Medications Online. Free Viagra Pills!
  • Buy Cheapest otc treatment for scabies Now WorldWide Shipping. Online Medical Shop.
  • Buy Cheapest diazepam mylan Now Cheap Pharmacy Online. Best Drugstore.
  • Buy Cheap cheap phentermine 37.5 Now The Largest Internet Pharmacy. Best Drugstore.
  • Buy Cheapest pain pills online thailand Online Best Drugstore. Cheap Pharmacy Online.
  • Buy Cheapest prescription drug store online Online Best Internet. Discount Pharmacy Online.
  • Buy Cheap over the counter weight loss drugs Now WorldWide Shipping. Cheap Online Pharmacy.
  • Buy Cheap klonopin effects Now Top Online Pharmacy Supplier. Low Prices.
  • Buy Cheapest erectile dysfunction syndrome drugs Online Best Online. Cheap Prescription Drugs.
  • Buy Cheapest buy ambien online without prescription Online Buy %items% Online Without Prescription.
  • Buy Cheapest viagra online overnight delivery Online Best Drugstore. Online Medical Shop.
  • Buy Cheap bayer levitra cheapest price online pharmacy Now Special Prices For bayer levitra cheapest price online pharmacy! Best Online.
  • Buy Cheapest indian tadalafil Now Best Prices. Cheap Prescription Drugs.
  • Buy Cheapest accutane before after Now Best Online. Pharmacy At The Best Price!
  • Buy Cheapest reliable online pharmacy Now Pharmacy At The Best Price! Best Online.
  • Buy Cheapest finasteride tablets Online Cheap Pharmacy Online. Low Prices.
  • Buy Cheap list pain meds Online Top Online Pharmacy. WorldWide Shipping.
  • Buy Cheap tramadol medicine online Online Internet Prices For tramadol medicine online! Best Internet.
  • Buy Cheapest cialis coupons Online Best Internet. Cheap Prescription Drugs.
  • Buy Cheapest cialis professional cheap Now Cheap Prescription Drugs. Best Drugstore.
  • Buy Cheapest online canada pharmacy Online Free Viagra Pills! Best Drugstore.