09 web services - ifrndiatinf.ifrn.edu.br/prof/lib/exe/fetch.php?media=user:1301182:... ·...
TRANSCRIPT
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
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>
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¶m2=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
UtilizandooGSON
• BibliotecaJavaparaprocessamentodeJSON– Versão2.2.4– ProcessaJSONemarquivooutexto
• https://code.google.com/p/google-gson/