Você está na página 1de 27

HTTP JSON

Edson Alexandre Sensato


profedsonsensato@fiap.com.br

Contedo
JSON
AsyncTask
Implementao Server
Implementao Client

Estudo de Caso
A Ton To Toys uma empresa que comercializa bonecos de briquedo. Atualmente, a
empresa utiliza a Internet como principal canal de comercializao de seus produtos.
Por meio de seu site, os clientes podem visualizar e comprar os diversos modelos de
bonecos. Contudo, a empresa deseja dar um passo alm e criar um canal de vendas
para dispositivos mveis. Sendo assim, foi solicitado o desenvolvimento de um app
Android com a possibilidade de exibir os produtos e tambm efetuar a compra dos
mesmos.

Arquitetura
Atualmente, a arquitetura composta por um servidor Tomcat e uma base de dados
oracle, onde a aplicao de e-commerce executada
A idia incluir a camada cliente Android acessando o servidor Tomcat para obter as
informaes da base de dados de produtos por meio da Internet, via HTTP
Os dados sero transmitidos de um lado a outro no formato JSON
CLIENTE

SERVIDOR

HTTP
JSON

JSON
O JSON (Javascript Object Notation) uma forma de encapsular dados de maneira
padronizada
Ao invs de utilizar a sintaxe XML em um webservice pode-se aplicar JSON que uma
estrutura mais leve
Referncia: http://www.json.org/json-pt.html
Os objetos podem ser encapsulados no lado servidor em formato JSON, transmitidos
para o cliente onde sero transformados novamente em objetos
O cliente tambm pode encapsular seus dados no formato JSON e transmit-los para o
servidor, no processo inverso

Sintaxe JSON
Imagine a seguinte classe que representa os produtos e uma instncia p1:
ProdutoBean
- id:int
- nome: String
- preco: float
- ativo: boolean

p1
- id = 100
- nome: Boneco Mergulhador
- preco: 50.0
- ativo: true

Na sintaxe JSON:
- Representao do atributo nome "nome":"Boneco Mergulhador"
- Representao do objeto p1
{"id":100, "nome":"Boneco Mergulhador", "preco":50.0, "ativo":true}

Arrays JSON
Vamos supor a existncia de 2 instncias de ProdutoBean:
ProdutoBean
- id:int
- nome: String
- preco: float
- ativo: boolean

p1
- id = 100
- nome: Mergulhador
- preco: 50.0
- ativo: true

p2
- id = 200
- nome: Caipira
- preco: 55.0
- ativo: true

Na sintaxe JSON:
"bonecos": [ {"id":100, "nome":"Mergulhador", "preco":50.0, "ativo":true},
{"id":200, "nome":"Caipira", "preco":55.0, "ativo":true} ]
Veja que os caracteres [ e ] indicam um array
Neste caso, bonecos representa um array com dois objetos do tipo ProdutoBean
7

JSON em Java / Android


No necessrio converter objetos em JSON e vice-versa manualmente
Existem vrias bibliotecas prontas responsveis por gerar a estrutura JSON a partir de objetos e
tambm por interpretar uma String JSON (parsing)
Por exemplo: https://code.google.com/p/org-json-java/downloads/list
Voc pode efetuar o donwload do arquivo jar, criar um simples Java Project e adicionar o
arquivo ao class path para efetuar testes...
O Android j oferece suporte JSON nativamente, nenhum arquivo adicional necessrio em seu
projeto!

Exemplo JSON em Java / Android


package json.test;
import org.json.JSONException;
import org.json.JSONObject;
public class TestJSON {
public static void main(String[] args) {
try {
JSONObject obj = new JSONObject();
obj.put("id", 100);
obj.put("nome", "Mergulhador");
obj.put("preco", 50.0f);
obj.put("ativo", true);
System.out.println(obj);
} catch (JSONException e) {
e.printStackTrace();
}
}
}

Este exemplo criar um JSONObject e define valores para


seus atributos por meio do mtodo put
Em seguida, exibe a String no formato JSON gerada:
{"id":100,"preco":50,"ativo":true,"nome":"Mergulhador"}
9

Exemplo Array JSON em Java / Android


JSONObject obj1 = new JSONObject();
obj1.put("id", 100);
obj1.put("nome", "Mergulhador");
obj1.put("preco", 50.0f);
obj1.put("ativo", true);

Neste outro exemplo, so instanciados dois objetos: obj1 e


obj2
Ambos objetos so adicionados a um array do tipo JSON
(JSONArray)

JSONObject obj2 = new JSONObject();

Ao imprimir o contedo do JSON Array temos o seguinte:

obj2.put("id", 200);
obj2.put("nome", "Caipira");
obj2.put("preco", 55.0f);
obj2.put("ativo", true);

[{"id":100,"preco":50,"ativo":true,"nome":"Mergulhador"},
{"id":200,"preco":55,"ativo":true,"nome":"Caipira"}]

JSONArray array = new JSONArray();


array.put(obj1);
array.put(obj2);
System.out.println(array);

10

Exemplo Parse JSON String em Java / Android


String v = "[{\"id\":100,\"preco\":50,\"ativo\":true,\"nome\":\"Mergulhador\"},
{\"id\":200,\"preco\":55,\"ativo\":true,\"nome\":\"Caipira\"}]";
JSONArray a = new JSONArray(v);
for (int i = 0; i < a.length(); i++)
System.out.println(a.getJSONObject(i).getString("nome"));

Finalmente, temos o exemplo inverso, isto , obter um objeto JSONObject a partir de uma
String no formato JSON
Executanto o cdigo acima, exibimos o valor do atributo nome de todos os objetos contidos no
array JSON referenciado pela varivel v
a.length() retorna o total de elementos contidos no array
Ento s efetuar um loop sobre os elementos do array e acessar os atributos desejados
a.getJSONObject(i).getString("nome") retorna o valor do atributo nome
a.getJSONObject(i).getDouble("preco") retorna o valor do atributo preo...

11

Implementao Servidor
Voltando preparao no lado servidor, ser necessrio criar um servlet dedicado a
oferecer os servios que sero consumidos pelo cliente Android
Tais servios recebero as requisies, efetuaro os processamentos necessrios e
gerao uma resposta no formato JSON

CLIENTE

SERVIDOR

HTTP

Servlet

JSON

12

Implementao Servlet
@WebServlet("/JSONServlet")
public class JSONServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
JSONObject obj1 = new JSONObject();
obj1.put("id", 100);
obj1.put("nome", "Mergulhador");
obj1.put("preco", 50.0f);
obj1.put("ativo", true);
JSONObject obj2 = new JSONObject();
obj2.put("id", 200);
obj2.put("nome", "Caipira");
obj2.put("preco", 55.0f);
obj2.put("ativo", true);
JSONArray array = new JSONArray();
array.put(obj1);
array.put(obj2);
// gera a resposta em formato texto codificado em UTF-8 (acentos, etc..)
response.setCharacterEncoding("UTF-8");
response.getWriter().print(array);

}
}

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

13

Testando o Servlet
Ao efetuar uma chamada GET no servidor, o retorno deve ser o seguinte:

14

AsyncTask
O acesso a recursos externos, por exemplo um web service, deve ser feito em um
thread separado do main thread
Main thread onde a aplicao executada
Assim, caso algo bloqueie o main thread, toda a aplicao comprometida
Soluo: utilizar um thread separado para acesso ao recurso externo
Problema: somente a main thread pode atualizar views da interface do usurio
Soluo melhor: utilizar AsyncTask

15

Classe AsyncTask
AsyncTask permite realizar operaes em um thread separado do main thread
Alm disso, oferece um mecanismo para atualizar views da interface do usurio
Para implementar um AsyncTask basta extender a classe:
AsyncTask<Parametro, Progresso, Resultado>
Onde:
Parametro - tipo de objeto a ser passado como parmetro
Progresso - indicador de progresso da operao
Resutado - tipo de objeto que recebe o resultado da operao
Todos os parmetros so opcionais - utilizar Void quando o parmetro for opcional

16

Mtodos de AsyncTask
A classe AsyncTask oferece alguns mtodos que podem ser implementados:
onPreExecute() - acionado antes da execuo da tarefa
doInBackground(Parametro... p) - onde a operao desejada executada - obrigatrio
onProgressUpdate(Progresso... p) - chamado quando houver atualizao do progresso
da atividade, pelo mtodo publishProgress(Progresso...)
onPostExecute(Resultado r) - acionado ao trmino da tarefa
Veja que os tipos de dados dos parmetros devem corresponder aos tipos declarados na
classe genrica AsyncTask<Parametro, Progresso, Resultado>

17

Exemplo Genrico de AsyncTask


class MinhaTarefa extends AsyncTask<String, Integer, String> {
@Override
protected void onPreExecute() { }
@Override
protected String doInBackground(String... params) {
// executa mtodo onProgressUpdate para atualizar andamento...
publishProgress(new Integer(100));
}
@Override
protected void onProgressUpdate(Integer... progress) { }
@Override
protected void onPostExecute(String result) { }
}

18

Exemplo Ciclo de Vida AsyncTask

MinhaTarefa mt = new MinhaTarefa();


mt.execute();

onPreExecute()

doInBackground()

terminou

onPostExecute()

atualizar progresso...

onProgressUpdate()

19

Executar a AsyncTask
Para executar a AsyncTask, basta acionar o mtodo execute e efetuar a passagem dos
parmetros definidos no mtodo doInBackground:
MinhaTarefa mt = new MinhaTarefa();
mt.execute("A", "B", "C");
Veja que os parmetros "A", "B" e "C" sero tratados como um array dentro do mtodo
doInBackground:
protected String doInBackground(String... params) {
int totalString = params.length;
for (int i = 0; i < totalString; i++)
Log.i("MinhaTask", params[i]);
}

20

HttpClient
O HttpClient uma classe disponvel nativamente na plataforma Android
utilizada para realizar requisies HTTP (POST, GET, etc...) do cliente para o servidor
Por exemplo, uma requisio GET
String url = "http://www.fiap.com.br";
InputStream content = null;
try {
HttpClient httpclient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
// executa a requisio GET
HttpResponse response = httpclient.execute(get);
// obtm o contedo retornado pela requisio GET
content = response.getEntity().getContent();
} catch (Exception e) {
e.printStackTrace();
}
21

Convertendo InputStream em String


O exemplo abaixo pode ser uitlizado para converter um InputStream retornado pela
requisio GET em uma String
// content est declarado no slide anterior!
BufferedReader reader = new BufferedReader(new InputStreamReader(content));
StringBuilder str = new StringBuilder();
// l linha a linha a partir do InputStream
String line = null;
while((line = reader.readLine()) != null)
str.append(line + "\n");
// retorno contm todo o contedo lido
String retorno = str.toString();

22

Permisso para a Internet


Requisies Internet, por medida de segurana, so bloqueadas nativamente
Caso necessrio acessar algum recurso na Internet (por exemplo via GET, POST)
preciso declarar explicitamente esta permisso
Para isso, editar o AndroidManifest.xml e acrescentar o usdes-premission:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="test.testejson" >
<uses-permission android:name="android.permission.INTERNET"/>

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

</manifest>
23

Acesso Localhost
Ateno!!!
Para acessar o localhost (127.0.0.1) a partir do emulador (AVD) deve-se utilizar o
seguinte endereo IP:

10.0.2.2
http://10.0.2.2:8080/MeuServico

24

Passando Parmetros
Os parmetros de uma requisio podem ser encapsulados em um BasicNameValuePair
Cria-se uma lista de parmetros (BasicNameValuePair), adiciona-se todos os parmetros
necessrios a ela e depois a coloca no formato URL (URLEncodedUtils)
String url = "http://10.0.2.2:8080/MeuServico/ServicoServlet";
List<NameValuePair> params = new LinkedList<NameValuePair>();
// adiciona os parmetros um a um...
params.add(new BasicNameValuePair("param1", "valor1");
params.add(new BasicNameValuePair("param2", "valor2");
url = url + "?" + URLEncodedUtils.format(params, "utf-8");

Como resultado:
http://10.0.2.2:8080/MeuServico/ServicoServlet?param1=valor1&param2=valor2

25

Requisio POST
Exemplo de POST
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
List<NameValuePair> nvList = new ArrayList<NameValuePair>();
BasicNameValuePair bnvp = new BasicNameValuePair("name", name);
nvList.add(bnvp);
post.setEntity(new UrlEncodedFormEntity(nvList));
HttpResponse resp = client.execute(post);
InputStream is = resp.getEntity().getContent();

26

Copyright 2011 Prof. Edson Alexandre Sensato


Todos direitos reservados. Reproduo ou divulgao total ou parcial deste documento expressamente proibido
sem o consentimento formal, por escrito, do Professor (autor).
27

Você também pode gostar