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 ListlstProducts = 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