Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Consumindo dados via web service no android

17,475 views

Published on

Published in: Technology

Consumindo dados via web service no android

  1. 1. Consumindo Web Service REST com Android Alexandre Antunes Bemobi & Portal Android
  2. 2. Intodução ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ Necessidade de ter um aplicativo online; Por que utilizar um Web Service (Padrão x Solução Proprietária); Tipos de Web Service (SOAP x REST); Overview das API’s existentes (String x Volley); Formatos de notação de dados (JSON x XML); Transformando dados em objetos Java (Android JSON x google-gson); Comunicação eficiente; Transmitindo dados seguros; Implementando um simples REST Client.
  3. 3. Necessidade de ter um aplicativo online
  4. 4. Necessidade de ter um aplicativo online ➢ ➢ ➢ ➢ ➢ ➢ ➢ Guardar dados em nuvem; Sistema multiplataforma (web, desktop e mobile); Saber qual o interesse dos usuários que estão acessando a plataforma; Controle de acesso; Serviço customizado para cada cliente; Compartilhar ações/dados/eventos; Redes sociais (Facebook, twitter e Google+).
  5. 5. Por que utilizar um Web Service (Protocolo Proprietário) ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ Identificadores de mensagens (sucesso e erro); Tipos de erros; Formato de dados (String??? Array de bytes??); Converter esses dados quando entram no sistema; Segurança (criptografia); Documentação do protocolo para implementação de terceiros; Debug; Custo; Tempo de desenvolvimento.
  6. 6. Por que utilizar um Web Service (Padrão) ➢ ➢ São baseados em tecnologia padrão; HTTP como protocolo de comunicação; ○ ○ ➢ ➢ ➢ ➢ ➢ ➢ Headers; Status code; SSL para seguraça; Dados em XML ou JSON; Ferramentas que facilitam a conversão dos dados; Ferramentas de debug (SoapUi, Postman, REST Console e etc.); API’s pada Java (Jersey, CXF, Spring MVC e etc.); Praticamente todas as linguagens suportam a criação de um Web Service.
  7. 7. Tipos de Web Service ➢ ➢ ➢ ➢ O Web Service foi criado para que aplicações desenvolvidas em linguagens diferentes possam se comunicar por meio de serviços (métodos) que são expostos para que outros sistemas possam acessálos. O objetivo dos Web Services é a comunicação de aplicações através da Internet. O W3C e OASIS são as instituições responsáveis pela padronização dos Web Services. Empresas como IBM, Microsoft e Sun apóiam o desenvolvimento desse padrão. Segundo o W3C um Web Service define-se como: um sistema projetado para suportar a interoperabilidade entre máquinas sobre rede.
  8. 8. Tipos de Web Service (SOAP) ➢ ➢ ➢ O SOAP (Simple Object Access Protocol) baseia-se numa invocação remota de um método e para tal necessita especificar o endereço do componente, o nome do método e os argumentos para esse método. Os dados são formatados em XML com determinadas regras e enviados normalmente por HTTP. Não define ou impõe qualquer semântica, quer seja de modelo de programação, quer seja a semântica específica da implementação. Este aspecto é extremamente importante, pois permite que o serviço ou o cliente sejam aplicações desenvolvidas por diferentes linguagens.
  9. 9. Tipos de Web Service (SOAP) ➢ ➢ O WSDL descreve os serviços disponibilizados à rede através de uma semântica XML, este providencia a documentação necessária para se chamar um sistema distribuído e o procedimento necessário para que esta cominicação se estabeleça. Enquanto o SOAP especifica a comunicação entre um cliente e um servidor, o WSDL descreve os serviços oferecidos.
  10. 10. Tipos de Web Service (REST) ➢ ➢ ➢ ➢ REST é uma técnica de engenharia de software para sistemas distribuídos desenvolvida pelo Roy Fielding. A REST (Transferência de Estado Representativo) é pretendida como uma imagem do design da aplicação se comportará: uma rede de websites (um estado virtual), onde o usuário progride com uma aplicação selecionando as ligações (transição de estado), tendo como resultado a página seguinte (que representa o estado seguinte da aplicação) que está sendo tranferida ao usuário e apresentada para seu uso. Sistemas que seguem os princípios REST são conhecidos como RESTful. WADL.
  11. 11. Tipos de Web Service (REST) ➢ ➢ ➢ O que é importante ter em mente é que o princial em um Web Service RESTful são as URLs do sistema e os resources. Um resource é um recurso, uma entidade, ou seja, é um objeto com informação que será representado por meio de um XML. Em geral, a URL para acessar esse recurso será sempre a mesma, porém caso mudemos o método HTTP (GET, POST, PUT e DELETE) o resultado da requisição será diferente. Método exemplo.com/recurso exemplo.com/recurso/1 GET Lista os recursos Detalhe de um recurso POST Adiciona um recurso - PUT - Atualiza um recurso DELETE - Remove um recurso
  12. 12. Formatos de dados (JSON x XML) ➢ ➢ ➢ ➢ JSON e XML são formatos para a notação de dados a serem transmitidos; A maior e mais importante diferença entre eles, e o que importa para nós nesse momento, é que o XML acaba ocupando muito mais espaço que o JSON quando representam o mesmo objeto. Isso acontece porque o XML usa uma tag para identificar o inicio e o final de cada nó. O JSON é fortemente recomendado quando estamos falando de dispositivos móveis, por consumir menos banda da conexão de internet do usuário.
  13. 13. Formatos de notação dados (JSON x XML)
  14. 14. Spring ➢ O Spring é uma ferramenta bastante usada por desenvolvedores Java e não podia estar de fora quando falamos em Android. ➢ A ferramenta para android é bem leve e simples de usar, apresentando as seguintes funcionalidades principais: ○ Rest Client para Android; ○ Suporte a autenticação para APIs seguras. ➢ Ela está disponível tanto para Maven quanto para o Gradle. ➢ Como ela é modular, podemos usar apenas o que vamos precisar.
  15. 15. Spring ➢ Maven <dependencies> <dependency> <groupId> org.springframework.android </groupId> <artifactId> spring-android-rest-template </artifactId> <version> 1.0.1.RELEASE </version> </dependency> </dependencies> ➢ Gradle dependencies { compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE' }
  16. 16. Spring - Utilização ➢ Criamos o nosso POJO, que será exatamente o mapeamento no nosso JSON: Retorno do Servidor: POJO: { public class Cliente { private int id; private String nome; private String cpf; private String endereco; "cpf": "111222333-00", "endereco": "Rua das ruas, 9", "id": "1", "nome": "Alexandre Antunes" } //Getters and Setters }
  17. 17. Spring - Utilização ➢ Para fazer o parse o Spring recomenda usar o Jackson, que é bastante usado e muito bom por sinal, mas normalmente é usado no lado do Servidor. <dependency> <groupId>com.fasterxml.jackson.core </groupId> <artifactId>jackson-databind </artifactId> <version>2.2.1</version> </dependency> ➢ A questão é avaliar o desempenho. Ele suporta as seguintes APIs para essa função: ○ ○ ○ Jackson JSON Processor; Jackson 2.x; Google Gson.
  18. 18. Spring - Utilização ➢ Fazendo a requisição ao serviço: // Saber a URL do serviço String url = "http://10.0.2.2:8080/WebServiceREST/cliente/1"; // Criar uma instância do RestTemplate RestTemplate restTemplate = new RestTemplate(); // Dizer ao Spring que você quer usar o Jackson para fazer o parse do JSON restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); // Executar o mmétodo HTTP GET, fazendo o parse do JSON para o Objeto Cliente Cliente cliente = restTemplate.getForObject(url, Cliente.class); ➢ Agora só nos basta usar esse objeto para popular nossa “view”, salvar no banco ou qualquer outra coisa.
  19. 19. Volley ➢ ➢ ➢ ➢ O Volley foi divulgado no Google I/O 2013; Basicamente ela serve para realizar requisições para a web com simplicidade e, o mais importante, rapidamente; Processamento das requisições e cache; Benefícios: ○ Gerencia automaticamente as requisições; ○ Cache em disco e memória; ○ Possibilidade de cancelar uma requisição; ○ Customização; ○ Debugging e tracing;
  20. 20. Volley - Utilização ➢ Baixar o Volley no Git e incluir o código no seu projeto: git clone https://android.googlesource.com/platform/frameworks/volley ➢ Importando projetos do Git: http://www.technotalkative.com/android-import-android-projects-from-git/ ➢ Fazendo a requisição ao serviço: // Saber a URL do serviço String url = "http://10.0.2.2:8080/WebServiceREST/cliente/1"; // Criar uma instância do RequestQueue RequestQueue queue = Volley.newRequestQueue(this);
  21. 21. Volley - Utilização // Criar uma instância do JsonObjectRequest, passando o método HTTP, a url, um callback de sucesso e um de erro. JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response. Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // TODO Incluir código de sucesso. // Usar a lib de JSON padrão ou o Gson para fazer o parse para o seu Objeto, // no nosso caso o objeto é o Cliente. Cliente cliente = parse(response); // Já veremos a implementação desse método. // Popular a View com o objeto Cliente. } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Incluir código para quando a requisição falhar. // Mostrar uma Dialog informando ao usuário o erro. } });
  22. 22. Transformando dados em objetos Java Existem várias formas e APIs para fazer o parse de um JSON para um objeto, as mais importantes são: ➢ Jackson: ○ Não é tão simples de implementar; ○ Tem dezenas de funcionalidades; ○ Com o Spring pode ser bem simples. ➢ Nativo JSONObject: ○ Já vem no SDK do Android; ○ Simples de implementar, mas trabalhoso; ➢ Google Gson: ○ Também pode usar com o Spring; ○ A mais simples. Em uma linha o seu objeto está pronto para usar;
  23. 23. Transformando dados em objetos Java ➢ Nativo JSONObject: private Cliente parse(JSONObject jsonObject) { Cliente cliente = new Cliente(); Retorno do Servidor: { try { cliente.setId(jsonObject.getString("id")); "cpf": "111222333-00", "endereco": "Rua das ruas, 9", cliente.setNome(jsonObject.getString("nome")); "id": "1", cliente.setCpf(jsonObject.getString("cpf")); "nome": "Alexandre Antunes" cliente.setEndereco(jsonObject.getString("endereco")); } catch (JSONException e) { e.printStackTrace(); } return cliente; } }
  24. 24. Transformando dados em objetos Java ➢ Google Gson: private Cliente parse(JSONObject jsonObject) { Gson gson = new Gson(); Retorno do Servidor: { return gson.fromJson(jsonObject, Cliente.class); "cpf": "111222333-00", "endereco": "Rua das ruas, 9", } "id": "1", "nome": "Alexandre Antunes" }
  25. 25. Spring x Volley Spring: ○ ➢ Volley ○ ○ ➢ Usa a thread atual para realizar a requisição (Como a partir da API level 11 do Android, não podemos mais executar tarefas demoradas na MainThread, é obrigatório que seja feito em uma thread separada (NetworkOnMainThreadException) - Recomendo o uso de uma AsyncTask para realizar essa função. Faz as requisições em uma nova thread; Implementa uma fila para as requisições. Ambos suportam HTTPS.
  26. 26. Comunicação eficiente
  27. 27. Comunicação eficiente
  28. 28. Comunicação eficiente ➢ Sempre informar ao usuário que os dados estão sendo carregados; ➢ Evitar trafegar dados desnecessários; ➢ Evitar requisições repetidas; ➢ Quebrar retornos muito grandes em várias requisições (paginar); ➢ Carregar a tela de forma assíncrona(textos x imagens);
  29. 29. Transmitindo dados seguros ➢ Autenticação (OAuth - token); ➢ Autorização (Áreas restritas); ➢ SSL (HTTPS);
  30. 30. Implementando um simples REST Client no Android public class HttpClientSingleton { private static final int JSON_CONNECTION_TIMEOUT = 3000; private static final int JSON_SOCKET_TIMEOUT = 5000; private static HttpClientSingleton instance; private HttpParams httpParameters ; private DefaultHttpClient httpclient; private void setTimeOut(HttpParams params){ HttpConnectionParams.setConnectionTimeout(params, JSON_CONNECTION_TIMEOUT); HttpConnectionParams.setSoTimeout(params, JSON_SOCKET_TIMEOUT); } private HttpClientSingleton() { httpParameters = new BasicHttpParams(); setTimeOut(httpParameters); httpclient = new DefaultHttpClient(httpParameters); } public static DefaultHttpClient getHttpClientInstace(){ if(instance==null) instance = new HttpClientSingleton(); return instance.httpclient; } }
  31. 31. Implementando um simples REST Client no Android public String[] get(String url) { String[] result = new String[2]; HttpGet httpget = new HttpGet(url); HttpResponse response; try { response = HttpClientSingleton.getHttpClientInstace().execute(httpget); HttpEntity entity = response.getEntity(); if (entity != null) { result[0] = String.valueOf(response.getStatusLine().getStatusCode()); InputStream instream = entity.getContent(); result[1] = toString(instream); instream.close(); Log.i("get", "Result from post JsonPost : " + result[0] + " : " + result[1]); } } catch (Exception e) { Log.e("NGVL", "Falha ao acessar Web service", e); result[0] = "0"; result[1] = "Falha de rede!"; } return result; }
  32. 32. Implementando um simples REST Client no Android private static final String URL_WS = "http://10.0.2.2:8080/WebServiceREST/cliente/"; public Cliente getCliente(int id) throws Exception { String[] resposta = new WebServiceCliente().get(URL_WS + id); if (resposta[0].equals("200")) { Gson gson = new Gson(); Cliente cliente = gson.fromJson(resposta[1], Cliente.class); return cliente; } else { throw new Exception(resposta[1]); } }
  33. 33. Fontes ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ ➢ http://pt.wikipedia.org/wiki/Web_service#SOAP http://pt.wikipedia.org/wiki/REST http://en.wikipedia.org/wiki/Web_Application_Description_Language http://spring.io/guides/gs/consuming-rest-android/ http://docs.spring.io/spring-android/docs/1.0.x/reference/html/rest-template.html http://www.portalandroid.org/comunidade/viewforum.php?f=119 https://github.com/FasterXML/jackson http://developer.android.com/reference/org/json/JSONObject.html https://code.google.com/p/google-gson/ http://www.technotalkative.com/android-import-android-projects-from-git/ http://java.dzone.com/articles/android-%E2%80%93-volley-library https://android.googlesource.com/platform/frameworks/volley https://gist.github.com/ficusk/5474673 http://pt.wikipedia.org/wiki/JSON http://pt.wikipedia.org/wiki/XML
  34. 34. Contato ➢ Alexandre Antunes ○ ○ ➢ Administrador do Portal Android; Membro organizador do GDG Rio de Janeiro; antunes@portalandroid.org

×