Consumare servizi Web con kSOAP

In questo tutorial imparerai come utilizzare i servizi Web utilizzando la famosa libreria kSOAP in un'applicazione Android. kSOAP è una libreria affidabile amata dagli sviluppatori che hanno la necessità di analizzare i messaggi WSDL (Web Service Definition Language) e SOAP (Simple Object Access Protocol).


introduzione

La libreria kSOAP è una libreria client SOAP elegante, leggera ed efficiente. La libreria è open source, facile da usare e può salvarti dalla seccatura di codificare un parser personalizzato. È una delle più affidabili librerie SOAP attualmente disponibili ed è frequentemente aggiornata, il che è un buon segno per qualsiasi progetto open source.

È spesso rischioso integrare un software open source (OSS) in un progetto poiché può causare problemi imprevisti lungo la strada. Cerca sempre commenti e recensioni di altri sviluppatori che hanno utilizzato la libreria. Se il progetto non è in fase di sviluppo attivo, potrebbe essere meglio cercare una soluzione alternativa.

L'obiettivo di questo tutorial è di familiarizzare con la libreria kSOAP. A scopo dimostrativo, utilizzeremo un semplice servizio Web da W3Schools. Il servizio Web è un convertitore Fahrenheit in Celsius. Il servizio web accetta un valore in gradi Fahrenheit e risponde con il valore equivalente in gradi Celsius. Analizzeremo l'esempio passo dopo passo. Alla fine di questo tutorial, visualizzeremo il risultato sul dispositivo dell'utente.


1. Per iniziare

Passaggio 1: Impostazione del progetto

Avvia un nuovo progetto Android e configuralo come preferisci. Sentiti libero di usare il tuo IDE preferito, ma per questo tutorial userò IntelliJ IDEA.

Nel file manifest del progetto, è necessario specificare che l'applicazione è autorizzata a connettersi a Internet. Specificheremo anche la versione dell'SDK di destinazione e la versione minima dell'SDK. Dai un'occhiata al file manifest mostrato di seguito.

  

Passaggio 2: download di kSOAP

Cerca sempre di utilizzare l'ultima versione stabile di una libreria o di aggiornare la libreria che stai utilizzando in un'applicazione dopo che è stato rilasciato un importante aggiornamento. È buona norma tenere aggiornate le dipendenze di un progetto per vari motivi, come la sicurezza e le correzioni di errori. In questo tutorial, utilizzeremo la versione 3.1.1 della libreria kSOAP, che puoi trovare nella pagina di download del progetto. Dopo aver scaricato la libreria kSOAP, aggiungila ai tuoi progetti libs cartella.

Passaggio 3: aggiunta di kSOAP al progetto

Per usare la libreria kSOAP nel tuo progetto, devi aggiungerlo al tuo progetto. Ti mostrerò come aggiungerlo usando IntelliJ IDEA. I passaggi potrebbero essere leggermente diversi se stai utilizzando un IDE diverso, ma l'idea è la stessa. In IntelliJ IDEA, scegli Struttura del progetto ... dal File menu, apri il moduli riquadro, fare clic su più pulsante nella parte inferiore del riquadro destro e selezionare la libreria. Vai a libs cartella e selezionare la libreria kSOAP. Dai un'occhiata alle due immagini qui sotto per chiarimenti.



La libreria kSOAP dovrebbe ora essere visibile come dipendenza del tuo progetto. Fare clic sulla casella di controllo accanto alla libreria kSOAP per aggiungerla al progetto. Ora che abbiamo aggiunto la libreria al nostro progetto, è ora di metterla in pratica. Se stai usando IntelliJ IDEA, il tuo progetto dovrebbe assomigliare a quello mostrato qui sotto.



2.W3Schools Web Service

L'uso della libreria kSOAP per consumare un servizio Web richiede una serie di passaggi. Tuttavia, prima di immergerci per prima cosa nell'uso della libreria kSOAP, è utile dirti qualcosa in più sul servizio web che useremo.

Visita il sito Web del servizio Web W3Schools che utilizzeremo in questo tutorial. Vedrai che ci sono due operazioni, CelsiusToFahrenheit e FahrenheitToCelsius. Il nome di ogni operazione è auto-esplicativo. L'URL del servizio web è l'URL di base che utilizzeremo per connettersi al servizio web.

Se si seleziona un'operazione sul sito Web W3Schools, viene mostrato un esempio della richiesta che il servizio Web si aspetta così come la risposta del servizio web. Dai uno sguardo allo snippet di codice qui sotto, che è una richiesta di esempio che il servizio web si aspetta. Presta molta attenzione al SOAPAction nello snippet di codice. Lo useremo un po 'più tardi in questo tutorial.

 POST /webservices/tempconvert.asmx Host HTTP / 1.1: www.w3schools.com Content-Type: text / xml; charset = utf-8 Content-Length: length SOAPAction: "http://www.w3schools.com/webservices/FahrenheitToCelsius"  stringa

Il prossimo snippet di codice mostra una risposta di esempio del servizio web.

 HTTP / 1.1 200 OK Content-Type: text / xml; charset = utf-8 Content-Length: length  stringa

3. Utilizzo di kSOAP

Passaggio 1: creazione di una busta

La prima cosa che dobbiamo fare è creare una busta SOAP usando il SoapSerializationEnvelope classe (org.ksoap2.serialization.SoapSerializationEnvelope), che devi importare dalla libreria kSOAP. Dai uno sguardo al frammento di codice qui sotto, in cui ho inizializzato un'istanza di SoapSerializationEnvelope classe.

 SoapSerializationEnvelope envelope = getSoapSerializationEnvelope (richiesta);

Il getSoapSerializationEnvelope il metodo non è definito nella libreria kSOAP. È un metodo di supporto che ho creato per rendere un po 'più semplice il lavoro con la libreria kSOAP. Il metodo restituisce la busta SOAP di cui abbiamo bisogno per il resto dell'esempio. Dai un'occhiata all'implementazione di getSoapSerializationEnvelope sotto.

 private final SoapSerializationEnvelope getSoapSerializationEnvelope (richiesta SoapObject) SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (SoapEnvelope.VER11); envelope.dotNet = true; envelope.implicitTypes = true; envelope.setAddAdornments (falsi); envelope.setOutputSoapObject (richiesta); busta di ritorno; 

Il getSoapSerializationEnvelope il metodo accetta a SoapObject istanza, che è la richiesta. Vedremo come creare la richiesta in pochi minuti. Quando si crea un'istanza di SoapSerializationEnvelope classe, il SoapEnvelope la versione è impostata passando in SoapEnvelope.VER11, che dice alla libreria kSOAP che useremo SAPONE 1.1. Impostiamo la busta dotNet proprietà a vero come il servizio web che consumeremo gira su Microsoft .NET framework.

 envelope.dotNet = true;

Passaggio 2: configurazione della busta

È giunto il momento di configurare la busta SOAP impostando le informazioni sulla richiesta. Inizia importando il file SoapObject classe (org.ksoap2.serialization.SoapObject) e dai uno sguardo al frammento di codice qui sotto per vedere come configurare la busta. Iniziamo creando un'istanza di SoapObject classe, che richiede due parametri, a namespace e a nome del metodo. È possibile aggiungere ulteriori proprietà alla richiesta utilizzando il addProperty metodo come mostrato di seguito. Nel nostro esempio, io uso addProperty per aggiungere il valore in gradi Fahrenheit alla richiesta.

 String methodname = "FahrenheitToCelsius"; SoapObject request = new SoapObject (NAMESPACE, methodname); request.addProperty ("Fahrenheit", fValue);

Forse ti starai chiedendo dove NAMESPACE viene da È una stringa statica privata definita altrove nell'applicazione, come puoi vedere di seguito.

 stringa finale statica privata NAMESPACE = "http://www.w3schools.com/webservices/";

Passaggio 3: creazione della richiesta

Per inviare la richiesta al servizio web, è necessario creare una richiesta di trasporto HTTP. Useremo il HttpTransportSE classe (org.ksoap2.transport.HttpTransportSE) per questo. Dai un'occhiata all'esempio qui sotto.

 HttpTransportSE ht = getHttpTransportSE ();

Come avrai intuito, getHttpTransportSE è un altro metodo di supporto e consente di creare rapidamente un oggetto di trasporto HTTP. Rende meno noioso creare un oggetto di trasporto HTTP ogni volta che si effettua una chiamata al servizio web. Dai un'occhiata alla sua implementazione qui sotto. Per creare un HttpTransportSE per esempio, abbiamo solo bisogno dell'URL di base del servizio web, che è un'altra stringa statica privata, come potete vedere qui sotto.

 private final HttpTransportSE getHttpTransportSE () HttpTransportSE ht = new HttpTransportSE (Proxy.NO_PROXY, MAIN_REQUEST_URL, 60000); ht.debug = true; ht.setXmlVersionTag (""); return ht;
 private static final String MAIN_REQUEST_URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

Nel getHttpTransportSE, configuriamo anche il HttpTransportSE oggetto. Passando Proxy.NO_PROXY come primo argomento del costruttore, si specifica che non viene utilizzato alcun proxy per la richiesta. Il terzo argomento del costruttore imposta il timeout della sessione in millisecondi. Per semplificare il debug, impostiamo anche l'oggetto mettere a punto proprietà a vero. Tutti i problemi che compaiono sono registrati in LogCat.

Passaggio 4: invio della richiesta

È ora di inviare la richiesta SOAP al servizio web. Lo facciamo su HTTP usando gli oggetti busta e di trasporto che abbiamo creato in precedenza. L'oggetto di trasporto HTTP ha a chiamata metodo, che viene utilizzato per aggiungere l'azione SOAP e la busta che abbiamo creato in precedenza.

 ht.call (SOAP_ACTION, envelope);

SOAP_ACTION è un'altra stringa statica privata, come puoi vedere qui sotto.

 stringa finale statica privata SOAP_ACTION = "http://www.w3schools.com/webservices/FahrenheitToCelsius";

Passaggio 5: elaborazione della risposta

Quando il servizio Web restituisce una risposta, dovremo elaborarla e gestire eventuali errori che potrebbero essere stati generati. Possiamo quindi visualizzare i dati all'utente. Dai uno sguardo al frammento di codice qui sotto in cui estraiamo la risposta dalla busta di risposta usando il getResponse metodo.

 SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse ();

Sto usando un SoapPrimitive scrivi, ma puoi anche usare a SoapObject istanza se la risposta dal servizio web è XML. È quindi possibile utilizzare il SoapObject istanza per ottenere i valori di risposta e memorizzarli in un array. Chiamata accordare sul SoapPrimitive oggetto per convertire la risposta in una semplice stringa per usarla nella tua applicazione.

Dai un'occhiata al prossimo snippet di codice in cui ho implementato un metodo getCelsiusConversion. Il metodo accetta una variabile stringa come unico argomento. La variabile viene aggiunta come proprietà alla richiesta SOAP come abbiamo visto in precedenza in questo tutorial. La variabile che il metodo consuma è il valore in gradi Fahrenheit. Questo valore viene inviato al servizio Web e elaborato e otteniamo una risposta in gradi Celsius.

 public String getCelsiusConversion (String fValue) String data = null; String methodname = "FahrenheitToCelsius"; SoapObject request = new SoapObject (NAMESPACE, methodname); request.addProperty ("Fahrenheit", fValue); SoapSerializationEnvelope envelope = getSoapSerializationEnvelope (richiesta); HttpTransportSE ht = getHttpTransportSE (); prova ht.call (SOAP_ACTION, envelope); testHttpResponse (HT); SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse (); List COOKIE_HEADER = (List) ht.getServiceConnection (). GetResponseProperties (); per (int i = 0; i < COOKIE_HEADER.size(); i++)  String key = COOKIE_HEADER.get(i).getKey(); String value = COOKIE_HEADER.get(i).getValue(); if (key != null && key.equalsIgnoreCase("set-cookie"))  SoapRequests.SESSION_ID = value.trim(); Log.v("SOAP RETURN", "Cookie :" + SoapRequests.SESSION_ID); break;   data = resultsString.toString();  catch (SocketTimeoutException t)  t.printStackTrace();  catch (IOException i)  i.printStackTrace();  catch (Exception q)  q.printStackTrace();  return data; 

Uso due corde in getCelsiusConversion, dati e methodname. Il dati la variabile sarà restituita dal metodo dopo che il servizio web ha restituito una risposta, mentre methodname memorizza il nome dell'operazione del servizio Web che verrà scelto come target e utilizzato in SoapObject esempio.

Potresti aver notato il per loop in getCelsiusConversion, che non fa parte dei passaggi che abbiamo discusso in precedenza. Quando si lavora con servizi Web più complessi, è importante tenere traccia della sessione corrente. Nello snippet seguente, memorizzo la sessione e ne tengo traccia ogni volta che effettuo una chiamata al servizio web.

 per (int i = 0; i < COOKIE_HEADER.size(); i++)  String key = COOKIE_HEADER.get(i).getKey(); String value = COOKIE_HEADER.get(i).getValue(); if (key != null && key.equalsIgnoreCase("set-cookie"))  SoapRequests.SESSION_ID = value.trim(); Log.v("SOAP RETURN", "Cookie :" + SoapRequests.SESSION_ID); break;  

4. Creazione dell'interfaccia utente

Ora che il duro lavoro è dietro di noi, è tempo di fare uso di ciò che abbiamo appena creato. Per concludere questo tutorial, ti mostrerò come creare un'interfaccia utente semplice per convertire un valore in gradi Fahrenheit in un valore in gradi Celsius e visualizzare il risultato sul dispositivo dell'utente.

Passaggio 1: crea il layout

Per prima cosa, dobbiamo creare un file XML nel progetto disposizione cartella. Dai uno sguardo allo snippet di codice qui sotto. È una semplice illustrazione di un'interfaccia utente creata in XML.

    

Creiamo tre componenti, a Modifica il testo esempio, a Pulsante istanza e a TextView esempio. Il Modifica il testo l'istanza viene utilizzata per inserire e acquisire il valore che intendiamo inviare al servizio web. Il pulsante viene utilizzato per eseguire il thread che richiama getCelsiusConversion e la visualizzazione del testo mostra la risposta che otteniamo dal servizio web.

Passaggio 2: creare l'attività

Il prossimo passo è creare un Attività istanza per visualizzare il layout che abbiamo appena creato. Dai un'occhiata al seguente frammento di codice. Questo non dovrebbe essere troppo sorprendente se prima hai sviluppato applicazioni Android.

 pacchetto com.example.KsoapExample; importare android.app.Activity; importare android.os.Bundle; la classe pubblica MyActivity estende l'attività / ** * chiamata quando l'attività viene creata per la prima volta. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); 

Ora che ci siamo occupati dell'interfaccia utente, possiamo legare tutto insieme. Dai un'occhiata al prossimo snippet di codice per vedere come è fatto.

 pacchetto com.example.KsoapExample; importare android.app.Activity; importare android.os.Bundle; public class MyActivity estende Activity private TextView txt; Stringa privata celsius; / ** * Chiamato quando l'attività viene creata per la prima volta. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); final EditText edt = (EditText) findViewById (R.id.value_to_convert); Button btn = (Button) findViewById (R.id.convert); txt = (TextView) findViewById (R.id.answer); btn.setOnClickListener (new View.OnClickListener () @Override public void onClick (View v) if (edt.length ()> 0) getCelsius (edt.getText (). toString ()); else txt. setText ("Il valore Fahrenheit non può essere vuoto.");); 

Nel onCreate, impostiamo un listener sul pulsante, btn. Verifichiamo anche che un valore sia inserito nel campo di inserimento prima di inviarlo al servizio web. Nel listener del clic del pulsante, il valore è passato a getCelsius viene eseguito il cast su una stringa poiché il servizio Web prevede un valore di stringa. L'implementazione di getCelsius non è difficile come puoi vedere qui sotto.

 private final void getCelsius (final String toConvert) new Thread (new Runnable () @Override public void run () SoapRequests ex = new SoapRequests (); celsius = ex.getCelsiusConversion (toConvert); handler.sendEmptyMessage (0);  ).inizio(); 

Nel getCelsius, viene creato un nuovo thread, che esegue e crea un'istanza della classe che implementa getCelsiusConversion. Quando riceviamo una risposta dal servizio web, inviamo un messaggio a un gestore per aggiornare l'interfaccia utente visualizzando il valore in gradi Celsius all'utente.

 public Handler handler = new Handler (new Handler.Callback () @ Override public boolean handleMessage (Message msg) switch (msg.what) caso 0: txt.setText (celsius); break; return false;)) ;

Nel gestore, aggiorniamo il TextView istanza con il valore che abbiamo ricevuto dal servizio web. Dai un'occhiata al risultato finale qui sotto.



Conclusione

Ora dovresti essere in grado di aggiungere la libreria kSOAP a un progetto e sfruttarlo per fare richieste a un servizio web che utilizza il protocollo SOAP. Lavorare con la libreria kSOAP diventerà più semplice con un po 'di pratica e quindi ti incoraggio a provare il servizio web di conversione da Celsius a Fahrenheit. Prova l'applicazione Android di esempio che fa parte del tutorial per un po 'di aiuto extra.