Você está na página 1de 34

Consumindo Web Service REST

com Android
Alexandre Antunes
Bemobi & Portal Android

Intoduo

Necessidade de ter um aplicativo online;


Por que utilizar um Web Service (Padro x Soluo Proprietria);
Tipos de Web Service (SOAP x REST);
Overview das APIs existentes (String x Volley);
Formatos de notao de dados (JSON x XML);
Transformando dados em objetos Java (Android JSON x google-gson);
Comunicao eficiente;
Transmitindo dados seguros;
Implementando um simples REST Client.

Necessidade de ter um aplicativo online

Necessidade de ter um aplicativo online

Guardar dados em nuvem;


Sistema multiplataforma (web, desktop e mobile);
Saber qual o interesse dos usurios que esto acessando a plataforma;
Controle de acesso;
Servio customizado para cada cliente;
Compartilhar aes/dados/eventos;
Redes sociais (Facebook, twitter e Google+).

Por que utilizar um Web Service (Protocolo Proprietrio)

Identificadores de mensagens (sucesso e erro);


Tipos de erros;
Formato de dados (String??? Array de bytes??);
Converter esses dados quando entram no sistema;
Segurana (criptografia);
Documentao do protocolo para implementao de terceiros;
Debug;
Custo;
Tempo de desenvolvimento.

Por que utilizar um Web Service (Padro)

So baseados em tecnologia padro;


HTTP como protocolo de comunicao;

Headers;
Status code;

SSL para seguraa;


Dados em XML ou JSON;
Ferramentas que facilitam a converso dos dados;
Ferramentas de debug (SoapUi, Postman, REST Console e etc.);
APIs pada Java (Jersey, CXF, Spring MVC e etc.);
Praticamente todas as linguagens suportam a criao de um Web
Service.

Tipos de Web Service

O Web Service foi criado para que aplicaes desenvolvidas em


linguagens diferentes possam se comunicar por meio de servios
(mtodos) que so expostos para que outros sistemas possam acesslos.
O objetivo dos Web Services a comunicao de aplicaes atravs da
Internet.
O W3C e OASIS so as instituies responsveis pela padronizao
dos Web Services. Empresas como IBM, Microsoft e Sun apiam o
desenvolvimento desse padro.
Segundo o W3C um Web Service define-se como: um sistema projetado
para suportar a interoperabilidade entre mquinas sobre rede.

Tipos de Web Service (SOAP)

O SOAP (Simple Object Access Protocol) baseia-se numa invocao


remota de um mtodo e para tal necessita especificar o endereo do
componente, o nome do mtodo e os argumentos para esse mtodo.
Os dados so formatados em XML com determinadas regras e enviados
normalmente por HTTP.
No define ou impe qualquer semntica, quer seja de modelo de
programao, quer seja a semntica especfica da implementao. Este
aspecto extremamente importante, pois permite que o servio ou o
cliente sejam aplicaes desenvolvidas por diferentes linguagens.

Tipos de Web Service (SOAP)

O WSDL descreve os servios disponibilizados rede atravs de uma


semntica XML, este providencia a documentao necessria para se
chamar um sistema distribudo e o procedimento necessrio para que
esta cominicao se estabelea.
Enquanto o SOAP especifica a comunicao entre um cliente e um
servidor, o WSDL descreve os servios oferecidos.

Tipos de Web Service (REST)

REST uma tcnica de engenharia de software para sistemas


distribudos desenvolvida pelo Roy Fielding.
A REST (Transferncia de Estado Representativo) pretendida como
uma imagem do design da aplicao se comportar: uma rede de
websites (um estado virtual), onde o usurio progride com uma
aplicao selecionando as ligaes (transio de estado), tendo como
resultado a pgina seguinte (que representa o estado seguinte da
aplicao) que est sendo tranferida ao usurio e apresentada para seu
uso.
Sistemas que seguem os princpios REST so conhecidos como
RESTful.
WADL.

Tipos de Web Service (REST)

O que importante ter em mente que o princial em um Web Service


RESTful so as URLs do sistema e os resources.
Um resource um recurso, uma entidade, ou seja, um objeto com
informao que ser representado por meio de um XML.
Em geral, a URL para acessar esse recurso ser sempre a mesma,
porm caso mudemos o mtodo HTTP (GET, POST, PUT e DELETE) o
resultado da requisio ser diferente.
Mtodo

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

Formatos de dados (JSON x XML)

JSON e XML so formatos para a notao de dados a serem


transmitidos;
A maior e mais importante diferena entre eles, e o que importa para
ns nesse momento, que o XML acaba ocupando muito mais espao
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 mveis, por consumir menos banda da conexo de internet
do usurio.

Formatos de notao dados (JSON x XML)

Spring

O Spring uma ferramenta bastante usada por desenvolvedores Java e


no 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 autenticao para APIs seguras.

Ela est disponvel tanto para Maven quanto para o Gradle.

Como ela modular, podemos usar apenas o que vamos precisar.

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

Spring - Utilizao

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


}

Spring - Utilizao

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 questo avaliar o desempenho. Ele suporta as seguintes APIs para


essa funo:

Jackson JSON Processor;


Jackson 2.x;
Google Gson.

Spring - Utilizao

Fazendo a requisio ao servio:


// Saber a URL do servio
String url = "http://10.0.2.2:8080/WebServiceREST/cliente/1";

// Criar uma instncia 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 mmtodo 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.

Volley

O Volley foi divulgado no Google I/O 2013;


Basicamente ela serve para realizar requisies para a web com
simplicidade e, o mais importante, rapidamente;
Processamento das requisies e cache;
Benefcios:
Gerencia automaticamente as requisies;
Cache em disco e memria;
Possibilidade de cancelar uma requisio;
Customizao;
Debugging e tracing;

Volley - Utilizao

Baixar o Volley no Git e incluir o cdigo 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 requisio ao servio:


// Saber a URL do servio
String url = "http://10.0.2.2:8080/WebServiceREST/cliente/1";
// Criar uma instncia do RequestQueue
RequestQueue queue = Volley.newRequestQueue(this);

Volley - Utilizao
// Criar uma instncia do JsonObjectRequest, passando o mtodo 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 cdigo de sucesso.
// Usar a lib de JSON padro 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 implementao desse mtodo.
// Popular a View com o objeto Cliente.
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
// TODO Incluir cdigo para quando a requisio falhar.
// Mostrar uma Dialog informando ao usurio o erro.
}
});

Transformando dados em objetos Java

Existem vrias formas e APIs para fazer o parse de um JSON para um


objeto, as mais importantes so:

Jackson:
No to 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:
Tambm pode usar com o Spring;
A mais simples. Em uma linha o seu objeto est pronto para usar;

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

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

Spring x Volley

Spring:

Volley

Usa a thread atual para realizar a requisio (Como a partir da API


level 11 do Android, no podemos mais executar tarefas demoradas
na MainThread, obrigatrio que seja feito em uma thread separada
(NetworkOnMainThreadException) - Recomendo o uso de uma AsyncTask
para realizar essa funo.

Faz as requisies em uma nova thread;


Implementa uma fila para as requisies.

Ambos suportam HTTPS.

Comunicao eficiente

Comunicao eficiente

Comunicao eficiente

Sempre informar ao usurio que os dados esto sendo carregados;

Evitar trafegar dados desnecessrios;

Evitar requisies repetidas;

Quebrar retornos muito grandes em vrias requisies (paginar);

Carregar a tela de forma assncrona(textos x imagens);

Transmitindo dados seguros

Autenticao (OAuth - token);

Autorizao (reas restritas);

SSL (HTTPS);

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

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

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

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

Contato

Alexandre Antunes

Administrador do Portal Android;


Membro organizador do GDG Rio de Janeiro;

antunes@portalandroid.org

Você também pode gostar