09 web services - ifrndiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:1301182:... ·...

30
Consumindo Web Services (WS) em Aplicações Android Prof. Fellipe Aleixo ( [email protected] )

Upload: others

Post on 03-Feb-2020

18 views

Category:

Documents


0 download

TRANSCRIPT

ConsumindoWebServices(WS)emAplicaçõesAndroid

Prof.FellipeAleixo([email protected])

OQueéumWS?

• Soluçãoutilizadanaintegraçãodesistemasenacomunicaçãodeaplicaçõesdiferentes

• Exemplo:WSqueretornaasinformaçõesdeumendereçodadoumCEP

AbordagensdeWS

• WSSOAP– ComunicaçãoatravésdoprotocoloSOAP(XML)– ExportaasdescriçõesdosserviçosemWSDL– CompartilhadadosporserializaçãoemXML

• WSRESTFul– ComunicaçãoatravésdainfraestruturaHTTP– ServidorWebésuficienteparaaceitarrequisições– CompartilhadadosporserializaçãoemJSON

APIs Relacionadas

• WSSOAP– KSOAP2 eKXML– DOM eSAXà escreverelerdadosemXML

• WSRESTFul– Restlet– Jersey– GSON eJacksonà escreverelerdadosemJSON

WSSOAPMaisdetalhessobreo

KSOAP2

• FrameworkparapermitiroacessoàWSbaseadosemSOAP

• Parautilizar:– CriarumprojetoAndroid eadicionararespectivabibliotecaaoBuildPath doprojeto• ksoap2-j2se-full-2.1.2.jar

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

ExemploKSOAP2

• AcessandoumWSdefinidoem.Net– InterfacedoWS:

using System;

namespace Exemple{public interfaceICurrencyService {decimalConvert(string from,string to,decimalvalue);

}}

ExemploKSOAP2

• ImplementaçãodoacessoaoWSemumaclasseespecífica– ConvertService

package br.edu.ifrn.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 {...

}//FIMdaclasse

public class ConvertService {private static finalString SOAP_ACTION=

"http://ifrn.edu.br/exemplo/Convert";private static finalString METHOD="Convert";private static finalString NAMESPACE="http://ifrn.edu.br/exemplo";private static finalString URL=

"http://127.0.0.1/ConvService/CurrencyService.asmx";

public String Convert(String fromCurr,String toCurr,String amount){SoapObject request =newSoapObject(NAMESPACE,METHOD);request.addProperty("from", fromCurr);request.addProperty("to", toCurr);request.addProperty("value", amount);

SoapSerializationEnvelope envelope=newSoapSerializationEnvelope(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();

}}

}//FIMdaclasse

ExemploKSOAP2

• AclassequeencapsulaacomunicaçãoéentãoinvocadaapartirdeumaActivity

package br.edu.ifrn.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 {...

}//FimdaActivity

public class Main extends Activity {private Spinner fromCurrencySpinner;private Spinner toCurrencySpinner;private EditText amountEdit;private EditText resultEdit;@Overridepublic void onCreate(Bundle savedInstanceState){

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

}

public void onConvertBtnClick(View v){String fromCurrency =(String)fromCurrencySpinner.getSelectedItem();String toCurrency =(String)toCurrencySpinner.getSelectedItem();String amount =amountEdit.getText().toString();ConvertService service =newConvertService();String result =

service.Convert(fromCurrency,toCurrency,amount);resultEdit.setText(result);

}}//FimdaActivity

AndroidManifest.xml<?xml version="1.0"encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="br.com.zbra.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>

Resultado

WSRESTFULMaisdetalhessobreo

ConsumindoumWSRESTFul

• FacilitaacomunicaçãoentreaplicaçõesmóveisesistemasexecutandoemservidoresWeboudeaplicação

• Tambémrequerapermissão:android.permission.INTERNET

• TrocadadosnoformatoJSON

AcessandooServiço

• DuasAPIs quepodemserutilizadasparaenviarrequisiçõesparaservidoresWeb– Ereceberemasrespectivasrespostas– (1)ApacheHTTPClient– (2)HttpUrlConnection (preferida)

ExemplocomHttpUrlConnectionpublic static JSONObject requestWebService(String serviceUrl) {

disableConnectionReuseIfNecessary();HttpURLConnection urlConnection =null;try {

URL urlToRequest =newURL(serviceUrl);urlConnection =(HttpURLConnection)urlToRequest.openConnection();urlConnection.setConnectTimeout(CONNECTION_TIMEOUT);urlConnection.setReadTimeout(DATARETRIEVAL_TIMEOUT);int statusCode =urlConnection.getResponseCode();if (statusCode ==HttpURLConnection.HTTP_UNAUTHORIZED) {

//handle unauthorized (if service requires user login)}else if (statusCode !=HttpURLConnection.HTTP_OK) {

//handle any other errors,like 404,500,..}InputStream in=new

BufferedInputStream(urlConnection.getInputStream());return newJSONObject(getResponseText(in));

ExemplocomHttpUrlConnectiontry {

...}catch(MalformedURLException e){

//URLis invalid}catch(SocketTimeoutException e){

//dataretrieval or connectiontimed out}catch(IOException e){

//could not read responsebody (could not create inputstream)}catch(JSONException e){

//responsebody is novalid JSONstring}finally {

if (urlConnection !=null){urlConnection.disconnect();

}}return null;

}

ExemplocomHttpUrlConnection

private static void disableConnectionReuseIfNecessary() {//see HttpURLConnection APIdocif (Integer.parseInt(Build.VERSION.SDK)<Build.VERSION_CODES.FROYO){

System.setProperty("http.keepAlive","false");}

}

private static String getResponseText(InputStream inStream){//very nice trick from//http://weblogs.java.net/blog/pat/archive/2004/10/stupid_scanner_1.htmlreturn newScanner(inStream).useDelimiter("\\A").next();

}

ExemplocomHttpUrlConnectionpublic List<MyItem> findAllItems(){

JSONObject serviceResult =WebServiceUtil.requestWebService("http://url/to/findAllService");

List<MyItem> foundItems =newArrayList<MyItem>(20);try {

JSONArray items =serviceResult.getJSONArray("items");for(int i =0;i <items.length(); i++){

JSONObject obj =items.getJSONObject(i);foundItems.add(newItem(obj.getInt("id"),obj.getString("name"),

obj.getBoolean("active")));}

}catch(JSONException e){//handle exception

}return foundItems;

}

EnviandoParâmetroscomPOSTURLurlToRequest =newURL(urlStr);HttpURLConnection urlConnection =(HttpURLConnection)

urlToRequest.openConnection();urlConnection.setDoOutput(true);urlConnection.setRequestMethod("POST");urlConnection.setRequestProperty("Content-Type",

"application/x-www-form-urlencoded");...urlConnection.setFixedLengthStreamingMode(

postParameters.getBytes().length);PrintWriter out=newPrintWriter(urlConnection.getOutputStream());out.print(postParameters);out.close();

//postParameters ==“param1=value1&param2=value2ʺ

OtimizandoWSparaAplicaçõesMóveis

1) UtilizeURLs curtas2) Enviesóosdadosrealmentenecessários3) Nomesdeatributoscomdoiscaracteres4) RemovacabeçalhosHTTPnãonecessários5) Nãorenderize espaçosembranco6) Númeromáximoderegistrosparacoleções7) Sigaasboaspráticasaointroduzirnovos

serviços

COMPARTILHAMENTODEINFORMAÇÕES

JSONDadosnoformato

RepresentaçãoJSON

ExemploJSON

UtilizandooGSON

• BibliotecaJavaparaprocessamentodeJSON– Versão2.2.4– ProcessaJSONemarquivooutexto

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

UtilizandooGSON

• Métodos:– toJson(Object)– fromJson(String,class)

Clientec =newCliente();

Gson gson =newGson();String json =gson.toJson(c);...Clienterecuperado=gson.fromJson(json,Cliente.class);