Dando continuidade à série de desenvolvimento de aplicações REST com Spring, neste post eu darei um exemplo de como realizar POST nas suas aplicaçoes Android com a utilização do Spring.
Novamente, se você não viu os posts anteriores, eu sugiro que dê uma olhada, eles podem esclarecer possíveis dúvidas (Desenvolvimento REST com Android e Consumindo JSON com Spring ).
Nos exemplos à seguir, eu demonstrarei como realizar dois tipos de POST para um servidor remoto, de acordo com o tipo de parâmetro que ele recebe.
Primeiro, enviaremos uma classe para um serviço que recebe um @RequestBody:
Serviço que recebe o POST:
[cc lang=”java” width=”100%”]
@RequestMapping(value = “/model”, method = RequestMethod.POST)
@ResponseBody
public Contato criarContatoModel(@RequestBody final Contato contato) {
// Implementação do método…
}
[/cc]
Método que envia o POST:
[cc lang=”java” width=”100%”]
public void onClick(final View v) {
RestTemplate restTemplate = new RestTemplate();
List
messageConverters.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
Contato contato = restTemplate.postForObject(“http://192.168.16.148:8080/rest/contatos/model”,
new Contato(“João”, “0000-0000”, “email@email.com”, “@twitter”, “/facebook”), Contato.class);
// Tratamento com os contatos recebidos…
}
[/cc]
A implementação acima, como pode-se perceber, é extremamente simples. Exige apenas um message converter para JSON, no caso o Jackson.
O envio para um serviço que recebe uma lista de parâmetros, no entanto é um pouco diferente:
[cc lang=”java” width=”100%”]
@RequestMapping(value = “/params”, method = RequestMethod.POST)
public Contato criarContato(@RequestParam final String nome, @RequestParam final String celular,
@RequestParam final String email, @RequestParam final String twitter, @RequestParam final String facebook) {
// Implementação do método…
}
[/cc]
Método de envio do POST:
[cc lang=”java” width=”100%”]
public void onClick(final View v) {
RestTemplate restTemplate = new RestTemplate();
List
messageConverters.add(new FormHttpMessageConverter());
messageConverters.add(new MappingJacksonHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
MultiValueMap
values.add(“nome”, “nome”);
values.add(“celular”, “celular”);
values.add(“email”, “email”);
values.add(“twitter”, “twitter”);
values.add(“facebook”, “facebook”);
Contatos result = restTemplate.postForObject(“http://192.168.16.148:8080/rest/contatos/params”, values,
Contatos.class);
// Tratamento com os contatos recebidos…
}
[/cc]
Nesta segunda implementação, devemos prestar atenção à alguns detalhes. Primeiro, nota-se que utilizamos dois message converters: um para a serialização dos valores a serem enviados (FormHttpMessageConverter), pois o serviço que recebe o POST espera um content-type “application/x-www-form-urlencoded”, e um para a serialização dos valores recebidos (MappingJackson), pois o serviço nos retorna o response em formato JSON.
Em segundo, lugar, os nossos parâmetros devem ser enviados dentro de um Map, ou, mais específicamente, de um MultiValueMap, pois este, atualmente, é o único que o FormHttp consegue serializar.
(Agradecimentos ao @oliverafelix pela ajuda na finalização do tutorial.)
Este foi mais um post da série Android, espero que tenham gostado. Quaisquer dúvidas, sugestões e/ou reclamações, comentem!
_________________________________________
Lucas Oliveira – Analista Programador na redspark.
Bacharel em Sistemas de Informação pela Universidade de São Paulo.
@OliveiraLima_