06 jul 2012

Android – Realizando POSTs com SpringAndroid

 

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:

1
2
3
4
5
6
    @RequestMapping(value = "/model", method = RequestMethod.POST)
    @ResponseBody
    public Contato criarContatoModel(@RequestBody final Contato contato) {
       
        // Implementação do método...
    }

Método que envia o POST:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void onClick(final View v) {
                RestTemplate restTemplate = new RestTemplate();

                List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
                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...
            }

 

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:

1
2
3
4
5
6
7
8
9
@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...

}

Método de envio do POST:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void onClick(final View v) {
                RestTemplate restTemplate = new RestTemplate();

                List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
                messageConverters.add(new FormHttpMessageConverter());
                messageConverters.add(new MappingJacksonHttpMessageConverter());
                restTemplate.setMessageConverters(messageConverters);

                restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

                MultiValueMap<String, String> values = new LinkedMultiValueMap<String, String>();
                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...
            }

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_

 

Leave a Comment