34
Consumindo Web Service REST com Android Alexandre Antunes Bemobi & Portal Android

Consumindo dados via web service no android

Embed Size (px)

Citation preview

Page 1: Consumindo dados via web service no android

Consumindo Web Service RESTcom Android

Alexandre AntunesBemobi & Portal Android

Page 2: Consumindo dados via web service no android

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.

Page 3: Consumindo dados via web service no android

Necessidade de ter um aplicativo online

Page 4: Consumindo dados via web service no android

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+).

Page 5: Consumindo dados via web service no android

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.

Page 6: Consumindo dados via web service no android

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.

Page 7: Consumindo dados via web service no android

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.

Page 8: Consumindo dados via web service no android

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.

Page 9: Consumindo dados via web service no android

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.

Page 10: Consumindo dados via web service no android

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.

Page 11: Consumindo dados via web service no android

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

Page 12: Consumindo dados via web service no android

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.

Page 13: Consumindo dados via web service no android

Formatos de notação dados (JSON x XML)

Page 14: Consumindo dados via web service no android

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.

Page 15: Consumindo dados via web service no android

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'

}

Page 16: Consumindo dados via web service no android

Spring - Utilização

➢ Criamos o nosso POJO, que será exatamente o mapeamento no nosso JSON:

POJO:

public class Cliente {private int id;private String nome;private String cpf;private String endereco;

//Getters and Setters}

Retorno do Servidor:

{ "cpf": "111222333-00", "endereco": "Rua das ruas, 9", "id": "1", "nome": "Alexandre Antunes"}

Page 17: Consumindo dados via web service no android

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.

Page 18: Consumindo dados via web service no android

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.

Page 19: Consumindo dados via web service no android

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;

Page 20: Consumindo dados via web service no android

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çoString url = "http://10.0.2.2:8080/WebServiceREST/cliente/1";

// Criar uma instância do RequestQueue

RequestQueue queue = Volley.newRequestQueue(this);

Page 21: Consumindo dados via web service no android

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>() {

@Overridepublic 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() {

@Overridepublic void onErrorResponse(VolleyError error) {

// TODO Incluir código para quando a requisição falhar.

// Mostrar uma Dialog informando ao usuário o erro.}

});

Page 22: Consumindo dados via web service no android

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;

Page 23: Consumindo dados via web service no android

Transformando dados em objetos Java

➢ Nativo JSONObject:

Retorno do Servidor:

{ "cpf": "111222333-00", "endereco": "Rua das ruas, 9", "id": "1", "nome": "Alexandre Antunes"}

private Cliente parse(JSONObject jsonObject) {

Cliente cliente = new Cliente();try {

cliente.setId(jsonObject.getString("id"));cliente.setNome(jsonObject.getString("nome"));cliente.setCpf(jsonObject.getString("cpf"));cliente.setEndereco(jsonObject.getString("endereco"));

} catch (JSONException e) {e.printStackTrace();

}return cliente;

}

Page 24: Consumindo dados via web service no android

Transformando dados em objetos Java

➢ Google Gson:

Retorno do Servidor:

{ "cpf": "111222333-00", "endereco": "Rua das ruas, 9", "id": "1", "nome": "Alexandre Antunes"}

private Cliente parse(JSONObject jsonObject) {

Gson gson = new Gson();return gson.fromJson(jsonObject, Cliente.class);

}

Page 25: Consumindo dados via web service no android

Spring x Volley

Spring:○ 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.

➢ Volley○ Faz as requisições em uma nova thread;○ Implementa uma fila para as requisições.

➢ Ambos suportam HTTPS.

Page 26: Consumindo dados via web service no android

Comunicação eficiente

Page 27: Consumindo dados via web service no android

Comunicação eficiente

Page 28: Consumindo dados via web service no android

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);

Page 29: Consumindo dados via web service no android

Transmitindo dados seguros

➢ Autenticação (OAuth - token);

➢ Autorização (Áreas restritas);

➢ SSL (HTTPS);

Page 30: Consumindo dados via web service no android

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; }}

Page 31: Consumindo dados via web service no android

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;

}

Page 32: Consumindo dados via web service no android

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]);

}

}

Page 33: Consumindo dados via web service no android

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

Page 34: Consumindo dados via web service no android

Contato

➢ Alexandre Antunes○ Administrador do Portal Android;○ Membro organizador do GDG Rio de Janeiro;

[email protected]