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

Post on 17-Feb-2019

219 views 0 download

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

Acesso a Internet

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

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>

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

Sockets

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

• Apenas TCP/IP e UDP

• Classes

• Socket

• DataOutputStream

• DataInputStream

5

HTTP API

• Classes

• HttpClient

• HttpGet, HttpPost

• HttpResponse

• HttpEntity

• Exemplo: HttpClient

6

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

Exemplo

8

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

10

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

Transformando JSON em Objetos Java (Native JSON)

12

{

"cpf": "111222333-00",

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

"id": "1",

"nome": "Alexandre Dumas"

}

Transformando JSON em Objetos Java (Google GSON)

13

{

"cpf": "111222333-00",

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

"id": "1",

"nome": "Alexandre Dumas"

}

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

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

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

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

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

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

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

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

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

}

}

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

}

}

...

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

}

}

}

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

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

}

• 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"/>

Para maiores informaçoes

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

network-ops/managing.html

28

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

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

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

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

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

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

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

CONSUMINDO UM WS REST

36

Implementando um simples REST Client no Android

37

Implementando um simples REST Client no Android

38

Implementando um simples REST Client no Android

39

CONSUMINDO UM WS SOAP

40

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

Exemplo KSOAP2

• Acessando um WS definido em .Net

• Interface do WS:

usingSystem;

namespaceExemple {

publicinterface ICurrencyService{

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

}

}

42

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

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

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

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

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

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

Resultado

49

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

COMPARTILHAMENTO DE INFORMAÇÕES

51

Representação JSON

Exemplo JSON

53

Exemplo de uso do JSON

• Vamos supor o seguinte objeto sendo transmitido em JSON:

{ user: { id: 123456, name: “Silvio Bacalá Jr", username: “sbacala", email: “sbacala@gmail.com" } }

54

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

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

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

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

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

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

Exemplo

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

User user = new User();

user.setId(123);

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

user.setEmail("joaodasilva@mail.com");

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

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

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