Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML,...

63
Acesso a Internet

Transcript of Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML,...

Page 1: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Acesso a Internet

Page 2: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Acesso a Rede • Para escrever uma aplicação que suporte

acesso à rede, o manifesto deve ter as permissões e filtros adequados.

• android.permission.INTERNET

• Permite abrir sockets de rede.

• android.permission.ACCESS_NETWORK_STATE

• permite para acessar informações sobre redes.

• ACTION_MANAGE_NETWORK_USAGE

• (introduzido no Android 4.0) indica que seu aplicativo define uma atividade que oferece opções para controlar o uso de dados.

2

Page 3: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

3

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.android.networkusage"

...>

<uses-sdk android:minSdkVersion="4"

android:targetSdkVersion="14" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application

...>

...

<activity android:label="SettingsActivity" android:name=".SettingsActivity">

<intent-filter>

<action android:name="android.intent.action.MANAGE_NETWORK_USAGE" />

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

</application>

</manifest>

Page 4: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Acesso à Internet

• Sockets

• Utilizar apenas quando for criado protocolo próprio

• Protocolo HTTP

• Permite usar APIs prontas

• java.net

• Apache Jakarta Commons

• WebServices

• REST

• SOAP 4

Page 5: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Sockets

• Conexão com a Internet de baixo nível.

• Apenas TCP/IP e UDP

• Classes

• Socket

• DataOutputStream

• DataInputStream

5

Page 6: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

HTTP API

• Classes

• HttpClient

• HttpGet, HttpPost

• HttpResponse

• HttpEntity

• Exemplo: HttpClient

6

Page 7: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

HTTP • DefaultHttpClient

• Projeto Apache.

• AndroidHttpClient:

• subtipo do DefaultHttpClient já configurado para valores otimizados no Android.

• não é mais recomendado utilizar estas classes, porque a equipe do Google não dá manutenção a essa implementação.

• HttpUrlConnection,

• que é desenvolvido e suportado pelo Google.

7

Page 8: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo

8

Page 9: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

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 nesse momento, é que o XML acaba ocupando muito mais espaço que o JSON quando representam o mesmo objeto.

• 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. 9

Page 10: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

10

Page 11: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

JSON (JavaScript Object Notation)

• JSON ganhou muita força como o formato mais utilizado no retorno de webservices, devido a sua simplicidade em comparação com XML.

• Android possui bibliotecas padrão para lidar com JSON:

• JSONObject: lida com um objeto em JSON e

• JSONArray: usada em arrays de objetos JSO

11

Page 12: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Transformando JSON em Objetos Java (Native JSON)

12

{

"cpf": "111222333-00",

"endereco": "Rua das ruas, 9",

"id": "1",

"nome": "Alexandre Dumas"

}

Page 13: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Transformando JSON em Objetos Java (Google GSON)

13

{

"cpf": "111222333-00",

"endereco": "Rua das ruas, 9",

"id": "1",

"nome": "Alexandre Dumas"

}

Page 14: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

JSON (JavaScript Object Notation)

• JSON ganhou muita força como o formato mais utilizado no retorno de webservices, devido a sua simplicidade em comparação com XML.

• Android possui bibliotecas padrão para lidar com JSON.Existem duas classes que são utilizadas com este propósito, JSONObject e JSONArray.

• A primeira serve para lidar com umobjeto em JSON, enquanto a segunda é usada em arrays

• de objetos JSON.

14

Page 15: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

ExemploJSON

{ "id": "0001", "name": "Curso de Android", "about": "www.facom.ufu.br - contato: Prof. Bacalá", "info": "Programação para Dispositivos Móveis usando Android", "location": { "city": "Uberlândia", "country": "Brasil", "street": "Campus Santa Mônica - Lab B4 - Bloco B", "zip": "38400.000" }, "website": "http://www.facom.ufu.br/~bacala/ANDROID", }

15

Page 16: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo TextView nameText = ( TextView ) findViewById (R.id.name_text ); TextView siteText = ( TextView ) findViewById (R.id.site_text ); TextView addressText = ( TextView ) findViewById (R.id.address_text ); TextView cityText = ( TextView ) findViewById (R.id.city_text ); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll()-.build(); StrictMode.setThreadPolicy ( policy ); String response = makeRequest ("http://www.facom.ufu.br/~bacala/ANDROID/exemploJSON); try { JSONObject json = new JSONObject ( response ); String name = json.getString ("name"); String site= json.getString (“website"); String address = json.getJSONObject ("location").getString ("street"); String city = json.getJSONObject ("location").getString ("city"); nameText.setText ( name ); siteText.setText ( getString (R.string.website_label , site)); addressText.setText ( getString (R.string.address_label , address )); cityText.setText ( getString (R.string.city_label , city )); } catch ( JSONException e) { e.printStackTrace (); }

16

Page 17: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

makeRequest

private String makeRequest ( String urlAddress ) { HttpURLConnection con = null ; URL url = null ; String response = null ; try { url = new URL ( urlAddress ); con = ( HttpURLConnection ) url.openConnection (); response = readStream ( con.getInputStream ()); } catch ( Exception e) { e.printStackTrace (); } finally { con.disconnect (); } return response ; }

17

Page 18: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

readStream private String readStream ( InputStream in) { BufferedReader reader = null ; StringBuilder builder = new StringBuilder (); try { reader = new BufferedReader (new InputStreamReader (in)); String line = null ; while (( line = reader.readLine ()) != null ) { builder.append ( line + "\n"); } } catch ( IOException e) { e.printStackTrace (); } finally { if ( reader != null ) { try { reader.close (); } catch ( IOException e) { e.printStackTrace (); } } } return builder.toString (); }

18

Page 19: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Executando operações de rede em um segmento separado

• Operações de rede podem implicar em atrasos imprevisíveis. Para evitar que isso cause uma má impressão do usuário, sempre execute operações de rede em um segmento separado da UI.

• O AsyncTask fornece uma das formas mais simples para disparar uma nova tarefa a partir do segmento.

19

Page 20: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

AsyncTask

• Encapsula em uma interface simples o uso de threads.

• Deve implementar obrigatoriamente o método doInBackground(), que é exatamente a tarefa que está sendo executada em background.

• Caso necessário alguma atualização na interface, é só sobrescrever o método onPostExecute(). Tudo que estiver dentro deste método é executado na UI thread.

• O método onPreExecute() é executado antes do doInBackground() e também é executado na UI thread.

20

Page 21: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Usando AsyncTask

• No trecho a seguir, o myClickHandler() chama DownloadWebpageTask().execute (stringUrl)

• DownloadWebpageTask é uma subclasse de AsyncTask e implementa as seguintes:

• doInBackground(): chama downloadURL() que obtém e processa o conteúdo da página web, retornando uma String.

• OnPostExecute (): pega a String retornada e exibe na UI.

21

Page 22: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

22

public class HttpExampleActivity extends Activity {

private static final String DEBUG_TAG = "HttpExample";

private EditText urlText;

private TextView textView;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

urlText = (EditText) findViewById(R.id.myUrl);

textView = (TextView) findViewById(R.id.myText);

}

// When user clicks button, calls AsyncTask.

// Before attempting to fetch the URL, makes sure that there is a network

connection.

public void myClickHandler(View view) {

// Gets the URL from the UI's text field.

String stringUrl = urlText.getText().toString();

ConnectivityManager connMgr = (ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

if (networkInfo != null && networkInfo.isConnected()) {

new DownloadWebpageTask().execute(stringUrl);

} else {

textView.setText("No network connection available.");

}

}

Page 23: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

23

// Uses AsyncTask to create a task away from the main UI thread. This task takes a

// URL string and uses it to create an HttpUrlConnection. Once the connection

// has been established, the AsyncTask downloads the contents of the webpage as

// an InputStream. Finally, the InputStream is converted into a string, which is

// displayed in the UI by the AsyncTask's onPostExecute method.

private class DownloadWebpageTask extends AsyncTask<String,Void,String> {

@Override

protected String doInBackground(String... urls) {

// params comes from the execute() call: params[0] is the url.

try {

return downloadUrl(urls[0]);

} catch (IOException e) {

return "Unable to retrieve web page. URL may be invalid.";

}

}

// onPostExecute displays the results of the AsyncTask.

@Override

protected void onPostExecute(String result) {

textView.setText(result);

}

}

...

Page 24: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

24

// Given a URL, establishes an HttpUrlConnection and retrieves

// the web page content as a InputStream, which it returns as

// a string.

private String downloadUrl(String myurl) throws IOException {

InputStream is = null;

// Only display the first 500 characters of the retrieved

// web page content.

int len = 500;

try {

URL url = new URL(myurl);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

conn.setReadTimeout(10000 /* milliseconds */);

conn.setConnectTimeout(15000 /* milliseconds */);

conn.setRequestMethod("GET");

conn.setDoInput(true);

// Starts the query

conn.connect();

int response = conn.getResponseCode();

Log.d(DEBUG_TAG, "The response is: " + response);

is = conn.getInputStream();

// Convert the InputStream into a string

String contentAsString = readIt(is, len);

return contentAsString;

// Makes sure that the InputStream is closed after the app is

// finished using it.

} finally {

if (is != null) {

is.close();

}

}

}

Page 25: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Verificando a conexão de rede

• Antes de seu aplicativo tenta se conectar à rede, ele deve verificar para ver se uma conexão de rede está disponível.

• O dispositivo pode estar fora de alcance de uma rede, ou o usuário pode ter desativado tanto Wi-Fi e acesso a dados móvel.

• Use getActiveNetworkInfo() e isConnected()

25

Page 26: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Verificando a conexão de rede

26

public boolean isOnline() {

ConnectivityManager connMgr = (ConnectivityManager)

getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();

return (networkInfo != null && networkInfo.isConnected());

}

Page 27: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

• Lendo e convertendo em Texto

• Lendo uma imagem

27

// Reads an InputStream and converts it to a String.

public String readIt(InputStream stream, int len)

throws IOException, UnsupportedEncodingException {

Reader reader = null;

reader = new InputStreamReader(stream, "UTF-8");

char[] buffer = new char[len];

reader.read(buffer);

return new String(buffer);

}

InputStream is = null;

...

Bitmap bitmap = BitmapFactory.decodeStream(is);

ImageView imageView = (ImageView) findViewById(R.id.image_view);

imageView.setImageBitmap(bitmap);

Não se esqueça:

<uses-permission android:name ="android.permission.INTERNET"/>

Page 28: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Para maiores informaçoes

http://developer.android.com/training/basics/

network-ops/managing.html

28

Page 29: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

WebServices

• Solução usada na integração de sistemas e na comunicação entre aplicações diferentes.

• Torna possível que novas aplicações possam interagir com as já existentes e que sistemas desenvolvidos em plataformas diferentes sejam compatíveis.

• Componentes que permitem às aplicações enviar e receber dados em formato XML.

• Cada aplicação pode ter a sua própria "linguagem", que é traduzida para uma linguagem universal, o formato XML.

29

Page 30: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

WebServices

• RESTFul

• Comunicação através da infraestrutura HTTP

• Servidor Web é suficiente para aceitar requisições

• Compartilha dados por serialização em JSON

• Requisição via URL (GET ou POST)

• Resposta em JSON, XML, etc.

• SOAP- Simple Object Access Protocol

• Comunicação através do protocolo SOAP (XML)

• Exporta as descrições dos serviços em WSDL

• Compartilha dados por serialização em XMLRequisição e resposta em XML

30

Page 31: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

APIs Relacionadas

• WS SOAP

• KSOAP2e KXML

• DOM e SAX

• escrever e ler dados em XML

• WS RESTFul

• Restlet

• Jersey

• GSON e Jackson

• escrever e ler dados em JSON

31

Page 32: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

SOAP (Simple Object Access Protocol)

• Invocação remota de um método necessitando

• endereço do componente,

• o nome do método e

• os argumentos para esse método.

• Dados formatados em XML e enviados por HTTP.

• Não define ou impõe qualquer semântica o que o serviço ou o cliente sejam aplicações desenvolvidas por diferentes linguagens.

32

Page 33: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

SOAP (Simple Object Access Protocol)

• WSDL descreve os serviços disponibilizados à rede através de XML, que providencia a documentação necessária para se chamar um sistema distribuído e o procedimento para que esta comunicação se estabeleça.

• SOAP especifica a comunicação entre um cliente e um servidor, o WSDL descreve os serviços oferecidos..

33

Page 34: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

REST (Transferência de Estado Representativo)

• Técnica de engenharia de software para sistemas distribuídos desenvolvida pelo Roy Fielding.

• 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),

• resultando na página seguinte (que representa o estado seguinte da aplicação) que está sendo transferida ao usuário e apresentada para seu uso.

• Sistemas que seguem os princípios REST são conhecidos como RESTful.

• Foco na URL e nos recursos. 34

Page 35: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

REST

• O principal em um Web Service RESTful são as URLs e os recursos.

• Recurso ou entidade, ou seja, um objeto com informação que será representado por meio de um XML.

• 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.

35

Page 36: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

CONSUMINDO UM WS REST

36

Page 37: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Implementando um simples REST Client no Android

37

Page 38: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Implementando um simples REST Client no Android

38

Page 39: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Implementando um simples REST Client no Android

39

Page 40: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

CONSUMINDO UM WS SOAP

40

Page 41: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

KSOAP2

• Framework para permitir o acesso à WS baseados em SOAP

• Para utilizar:

• Criar um projeto Android e adicionar a respectiva biblioteca ao Build Path do projeto

• ksoap2-j2se-full-2.1.2.jar

• Download:

• http://sourceforge.net/projects/ksoap2/files/ksoap2/2.1.2/

41

Page 42: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo KSOAP2

• Acessando um WS definido em .Net

• Interface do WS:

usingSystem;

namespaceExemple {

publicinterface ICurrencyService{

decimal Convert(string from, string to, decimal value);

}

}

42

Page 43: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo KSOAP2

• Implementação do acesso ao WS em uma classe específica –ConvertService

package exemplo;

import org.ksoap2.SoapEnvelope;

import org.ksoap2.serialization.SoapObject;

import org.ksoap2.serialization.SoapPrimitive;

import org.ksoap2.serialization.SoapSerializationEnvelope;

import org.ksoap2.transport.HttpTransportSE;

public class ConvertService{

...

} // FIM da classe 43

Page 44: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

public class ConvertService{ private static final StringSOAP_ACTION = "http://ufu.br/exemplo/Convert";

private static final String METHOD = "Convert"; private static final String NAMESPACE = "http://ufu.br/exemplo"; private static final String URL = "http://127.0.0.1/ConvService/CurrencyService.asmx"; public String Convert(String fromCurr, String toCurr, String amount) { SoapObject request= new SoapObject(NAMESPACE, METHOD); request.addProperty("from", fromCurr); request.addProperty("to", toCurr); request.addProperty("value", amount); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet= true; envelope.setOutputSoapObject(request); try{ HttpTransportSE androidHttpTransport= new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); SoapPrimitive result= (SoapPrimitive) envelope.getResponse(); return result.toString(); } catch (Exception e) { return e.getMessage(); } } } // FIM da classe

44

Page 45: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo KSOAP2

• A classe que encapsula a comunicação é então invocada a partir de uma Activity

package exemplo;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.EditText;

import android.widget.Spinner;

public class Main extends Activity{

...

} // Fim da Activity 45

Page 46: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

public class Main extends Activity{

private Spinner fromCurrencySpinner;

private Spinner toCurrencySpinner;

private EditText amountEdit;

private EditText resultEdit;

@Override

public void onCreate(BundlesavedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

bindControls();

}

private void bindControls() {

fromCurrencySpinner= (Spinner)

findViewById(R.id.from_currency_edit);

toCurrencySpinner= (Spinner)

findViewById(R.id.to_currency_edit);

amountEdit= (EditText)

findViewById(R.id.amount_edit);

resultEdit= (EditText) findViewById(R.id.result_edit);

}

46

Page 47: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

public void onConvertBtnClick(View v) {

String fromCurrency= (String)

fromCurrencySpinner.getSelectedItem();

String toCurrency= (String)

toCurrencySpinner.getSelectedItem();

String amount= amountEdit.getText().toString();

ConvertService service= new ConvertService();

Stringresult=

service.Convert(fromCurrency, toCurrency, amount);

result Edit.setText(result);

}

} // Fim da Activity

47

Page 48: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="br.com.zebra.android.sample"

android:versionCode="1"

android:versionName="1.0">

<uses-sdk android:minSdkVersion="8" />

<uses-permission android:name="android.permission.INTERNET” />

<application android:icon="@drawable/icon"

android:label="@string/app_name">

<activity android:name=".Main" android:label="@string/app_name">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER"/>

</intent-filter>

</activity>

</application>

</manifest>

48

Page 49: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Resultado

49

Page 50: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Otimizando WS para Aplicações Móveis

1. Utilize URLs curtas

2. Envie só os dados realmente necessários

3. Nomes de atributos com dois caracteres

4. Remova cabeçalhos HTTP não necessários

5. Não renderize espaços em branco

6. Número máximo de registros para coleções

7. Siga as boas práticas ao introduzir novos serviços

50

Page 51: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

COMPARTILHAMENTO DE INFORMAÇÕES

51

Page 52: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Representação JSON

Page 53: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo JSON

53

Page 54: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo de uso do JSON

• Vamos supor o seguinte objeto sendo transmitido em JSON:

{ user: { id: 123456, name: “Silvio Bacalá Jr", username: “sbacala", email: “[email protected]" } }

54

Page 55: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo de uso do JSON

• Carregando um bean com dados do JSON: public User loadUserFromJSON(String jsonString) {

User user = new User();

try {

JSONObject userObject = new

JSONObject(jsonString);

user.setId(userObject.getInt("id"));

user.setName(userObject.getString("name"));

user.setUsername(userObject.getString("username"));

user.setEmail(userObject.getString("email"));

} catch (JSONException e) {

e.printStackTrace();

}

return user;

}

55

Page 56: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo de uso do JSON

• Convertendo dados do JSON em bean: public String userToJSON(User user) {

JSONObject object = new JSONObject();

try {

object.put("id", user.getId());

object.put("name", user.getName());

object.put("username", user.getUsername());

object.put("email", user.getEmail());

} catch (JSONException e) {

e.printStackTrace();

}

return object.toString();

}

56

Page 57: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Utilizando o GSON • Google criou o projeto Gson, com os

objetivos:

• Prover uma interface simples para ler e exportar no formato JSON.

• Permitir que objetos pré-existentes e que não possam ser alterados sejam convertidos para e partir de JSON.

• Suporte ao generics do Java.

• Representação customizada de objetos.

• Suporte a tipos complexos de objetos.

57

Page 58: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Utilizando o GSON • Assim, a promessa do Gson é com poucas

linhas gerar objetos a partir de uma String JSON.

• Biblioteca Java para processamento de JSON

• Versão 2.2.4

• Processa JSON em arquivo ou texto

https://code.google.com/p/google-gson/

58

Page 59: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Utilizando o GSON

• Métodos:

• toJson(Object)

• fromJson(String, class)

Cliente c= new Cliente();

Gson gson= new Gson();

String json= gson.toJson(c);

...

Cliente recuperado =

gson.fromJson(json, Cliente.class);

59

Page 60: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo

• A conversão do objeto user que foi demonstrado anteriormente, se for utilizar Gson

public User loadUserFromJSONGson(String jsonString) {

Gson gson = new Gson();

User user = gson.fromJson(jsonString, User.class);

return user;

}

60

Page 61: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Exemplo

• Usando... /criação do objeto para demonstrar...

User user = new User();

user.setId(123);

user.setName("João da Silva");

user.setEmail("[email protected]");

user.setUsername("joaosilva");

//código que faz o trabalho ;-)

Gson gson = new Gson();

String userJSONString = gson.toJson(user);

//Para ver o resultado no Logcat

Log.d("Gson", "user JSON String: "+userJSONString);

61

Page 62: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Mais Informações

Utilizando Web Services no Google Android

• http://www.cesar.org.br/site/files/file/

WM23_Android_WebServices.pdf

Como consumir um Web Service pelo Android

• http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17465

JSON fácil em Java com GSon !

• http://blog.globalcode.com.br/2012/02/json-facil-em-java-com-gson.html

62

Page 63: Acesso a Internet - Faculdade de Computaçãobacala/ANDROID/11 - AcessoWeb.pdf · através de XML, que providencia a documentação necessária para se chamar um sistema distribuído

Trabalho - entrega em 17/11

• Elaborar um app para consumir o WS de CEP em https://viacep.com.br/

Exemplo: https://viacep.com.br/ws/38408114/json

Resultado:

{

"cep": "38408-114",

"logradouro": "Rua Antônio de Souza Franqueiro",

"complemento": "",

"bairro": "Santa Mônica",

"localidade": "Uberlândia",

"uf": "MG",

"unidade": "",

"ibge": "3170206",

"gia": ""

} 63