terça-feira, 7 de abril de 2015

Comunicação Web Service REST e Android

 Este post tem o principal intúito de mostrar a comunicação entre um dispositivo Android e um servidor webservice REST através de classes que realizam o trabalho sujo de transformar objetos em mensagens REST e vice-versa.

Object JSON

Objeto que será transformado em JSON durante o processo de comunicação. 
public class Product {

 String name;
 int qty;
 
 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getQty() {
  return qty;
 }

 public void setQty(int qty) {
  this.qty = qty;
 }

 @Override
 public String toString() {
  return "Product [name=" + name + ", qty=" + qty + "]";
 }
}

REST Server WebService

Webservice JSON REST

Classe de webservice que define endereços REST para os processos GET e POST. Exemplo simplesmente armazena os valores vindos do POST em uma lista de objetos que é devolvida quando requisitado o endereço GET.
@Path("/json/product")
public class JSONService {

        private static List lstProducts = new ArrayList();

 @GET
 @Path("/get")
 @Produces("application/json")
 public List getProductInJSON() {
  return lstProducts; 
 }

 @POST
 @Path("/post")
 @Consumes("application/json")
 public Response createProductInJSON(Product product) {
                lstProducts.add(product);
  String result = "Product created : " + product;
  return Response.status(201).entity(result).build();
 }
}

Link do projeto server-webservice: rest-server-example


Android

A mesma classe Produto foi copiada para projeto Android.

Enviando dados

Classe que envia dados utilizando POST

public class RestPutTask extends AsyncTask<Product, Void, Boolean> {

    @Override
    protected Boolean doInBackground(Product... params) {

        Boolean ret = Boolean.FALSE;

        try {
            final String urlPost = "http://MY_SERVER:8080/test/json/product/post";

            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

            String sRet;
            sRet = restTemplate.postForObject(urlPost, params[0], String.class);
            Log.i("Retorno", sRet);
            ret = sRet != null;

        } catch (Exception e) {
            Log.e("MainActivity", e.getMessage(), e);
        }

        return ret;
    }

    @Override
    protected void onPostExecute(Boolean aBoolean) {
        super.onPostExecute(aBoolean);
    }

}

Recebendo dados

Classe que recupera objetos através de GET
public class RestGetTasks extends AsyncTask<List<String>, ArrayAdapter, Product[]>{

    private ArrayAdapter adapter;

    public RestGetTasks(ArrayAdapter adapter) {
        this.adapter = adapter;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected Product[] doInBackground(List... params) {


        try {
            final String urlPost = "http://MY_SERVER:8080/test/json/product/get";

            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
            restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());

            String sRet;
            Product[] products = restTemplate.getForObject(urlPost, Product[].class);
            params[0].clear();

            for (Product p : products) {
                Log.i("Produto:", p.getName() + ":" + p.getQty());
                params[0].add(p.getName() + ":" + p.getQty());
            }


        } catch (Exception e) {
            Log.e("MainActivity", e.getMessage(), e);
        }

        return null;

    }

    @Override
    protected void onPostExecute(Product[] products) {
        super.onPostExecute(products);

        adapter.notifyDataSetChanged();
    }
}

Link do projeto android rest example: android-rest-example

Referências:

Nenhum comentário:

Postar um comentário

Drunk Penguins

Drunk Penguins
Drunk Penguins