Consumarea serviciilor Web cu kSOAP

În acest tutorial, veți învăța cum să consumați servicii web utilizând biblioteca populară kSOAP dintr-o aplicație Android. kSOAP este o bibliotecă reputațională iubită de dezvoltatorii care au nevoie să parseze mesajele WSDL (limbajul de definire a serviciului Web) și SOAP (Simple Object Access Protocol).


Introducere

Biblioteca kSOAP este o bibliotecă de clienți SOAP elegantă, ușoară și eficientă. Biblioteca este open source, ușor de utilizat, și vă poate salva de la hassle de codificare un parser personalizat. Este una dintre cele mai sigure biblioteci SOAP disponibile în prezent și este actualizată frecvent, ceea ce reprezintă un semn bun pentru orice proiect open source.

Este adesea riscant să se integreze software-ul open source (OSS) într-un proiect deoarece poate provoca probleme neprevăzute pe drum. Căutați întotdeauna comentarii și recenzii ale altor dezvoltatori care au folosit biblioteca. Dacă proiectul nu este în curs de dezvoltare activă, ar fi mai bine să căutați o soluție alternativă.

Obiectivul acestui tutorial este să vă familiarizați cu biblioteca kSOAP. În scopuri demonstrative, vom folosi un serviciu web simplu de la W3Schools. Serviciul web este un convertor Fahrenheit-Celsius. Serviciul web acceptă o valoare în grade Fahrenheit și răspunde cu valoarea echivalentă în grade Celsius. Vom trece exemplul pas cu pas. La sfârșitul acestui tutorial, vom afișa rezultatul pe dispozitivul utilizatorului.


1. Noțiuni de bază

Pasul 1: Configurarea proiectului

Porniți un nou proiect Android și configurați-l după cum doriți. Simțiți-vă liber să utilizați IDE-ul preferat, dar pentru acest tutorial voi folosi IntelliJ IDEA.

În fișierul manifest al proiectului, trebuie să specificați că aplicația este autorizată să se conecteze la internet. De asemenea, vom specifica versiunea SDK țintă, precum și versiunea SDK minimă. Aruncați o privire la fișierul manifestat prezentat mai jos.

  

Pasul 2: Descărcarea kSOAP

Încercați întotdeauna să utilizați ultima versiune stabilă a unei biblioteci sau să faceți upgrade la biblioteca pe care o utilizați într-o aplicație după ce a fost lansată o actualizare majoră. Este o practică bună să actualizați dependențele unui proiect din mai multe motive, cum ar fi remedierile de securitate și de erori. În acest tutorial, vom folosi versiunea 3.1.1 a bibliotecii kSOAP, pe care o puteți găsi pe pagina de descărcare a proiectului. După descărcarea bibliotecii kSOAP, adăugați-o la proiectul dvs. libs pliant.

Pasul 3: Adăugarea kSOAP la proiectul dvs.

Pentru a utiliza biblioteca kSOAP în proiectul dvs., va trebui să o adăugați la proiectul dvs. Vă voi arăta cum să îl adăugați utilizând IntelliJ IDEA. Pașii pot fi ușor diferiți dacă utilizați un IDE diferit, dar ideea este aceeași. În IntelliJ IDEA, alegeți Structura proiectului ... de la Fişier meniu, deschideți module , faceți clic pe la care se adauga butonul din partea de jos a panoului din dreapta și selectați biblioteca. Navigați la libs și selectați biblioteca kSOAP. Uitați-vă la cele două imagini de mai jos pentru clarificare.



Biblioteca kSOAP ar trebui să fie acum vizibilă ca o dependență a proiectului dvs. Dați clic pe caseta de selectare de lângă biblioteca kSOAP pentru ao adăuga la proiectul dvs. Acum că am adăugat biblioteca în proiectul nostru, este timpul să o folosim. Dacă utilizați IntelliJ IDEA, proiectul dvs. ar trebui să arate similar cu cel prezentat mai jos.



2.W3Schools Web Service

Utilizarea bibliotecii kSOAP pentru a consuma un serviciu web implică o serie de pași. Cu toate acestea, înainte de a ne arunca cu capul mai întâi în utilizarea bibliotecii kSOAP, este util să vă spunem ceva mai mult despre serviciul web pe care îl vom folosi.

Vizitați site-ul web al serviciului web W3Schools pe care îl vom folosi în acest tutorial. Veți vedea că există două operațiuni, CelsiusToFahrenheit și FahrenheitToCelsius. Numele fiecărei operațiuni este explicabil. URL-ul serviciului web este URL-ul de bază pe care îl vom folosi pentru a vă conecta la serviciul web.

Dacă selectați o operațiune pe site-ul web W3Schools, vi se va arăta un exemplu al cererii pe care se așteaptă serviciul web, precum și răspunsul serviciului web. Uitați-vă la fragmentul de cod de mai jos, care este un exemplu de cerere pe care îl așteaptă serviciul web. Acordați o atenție deosebită SOAPAction în fragmentul de cod. Îl vom folosi puțin mai târziu în acest tutorial.

 POST /webservices/tempconvert.asmx Host HTTP / 1.1: www.w3schools.com Tip de conținut: text / xml; charset = utf-8 Content-Length: lungimea SOAPAction: "http://www.w3schools.com/webservices/FahrenheitToCelsius"  şir

Următorul fragment de cod afișează un exemplu de răspuns al serviciului web.

 HTTP / 1.1 200 OK Tip de conținut: text / xml; charset = utf-8 Content-Length: lungime  şir

3. Folosind kSOAP

Pasul 1: Crearea unui plic

Primul lucru pe care trebuie să-l facem este crearea unui plic SOAP utilizând SoapSerializationEnvelope clasa (org.ksoap2.serialization.SoapSerializationEnvelope), pe care trebuie să le importați din biblioteca kSOAP. Uitați-vă la fragmentul de cod de mai jos, în care am inițializat o instanță a SoapSerializationEnvelope clasă.

 SoapSerializationPanel develope = getSoapSerializationEnvelope (cerere);

getSoapSerializationEnvelope metoda nu este definită în biblioteca kSOAP. Este o metodă de ajutor pe care am creat-o pentru a face lucrul cu biblioteca kSOAP un pic mai ușor. Metoda returnează plicul SOAP de care avem nevoie pentru restul exemplului. Aruncați o privire la punerea în aplicare a getSoapSerializationEnvelope de mai jos.

 finală privată SapunSerializareEnvelope getSoapSerializareEnvelope (Cerere SoapObject) SoapSerializationEnvelope plic = newSaapSerializationEnvelope (SoapEnvelope.VER11); envelope.dotNet = adevărat; envelope.implicitTypes = adevărat; envelope.setAddAdornments (false); envelope.setOutputSoapObject (cerere); plic de întoarcere; 

 getSoapSerializationEnvelope metoda acceptă a SoapObject exemplu, care este cererea. Vom vedea cum să creați solicitarea în doar câteva minute. Când creați o instanță a SoapSerializationEnvelope clasa, SoapEnvelope versiunea este setată prin trecerea SoapEnvelope.VER11, care spune bibliotecii kSOAP pe care o vom folosi SOAP 1.1. Am setat plicul DOTNET proprietate la Adevărat deoarece serviciul web pe care îl vom consuma rulează pe cadrul Microsoft .NET.

 envelope.dotNet = adevărat;

Pasul 2: Configurarea plicului

Acum este timpul să configurați plicul SOAP setând informațiile despre solicitare. Începeți prin importarea SoapObject clasa (org.ksoap2.serialization.SoapObject) și aruncați o privire asupra fragmentului de cod de mai jos pentru a vedea cum să configurați plicul. Începem prin crearea unui exemplu de SoapObject clasa, care necesită doi parametri, a Spațiu de nume și a numele metodei. Puteți adăuga proprietăți suplimentare la cerere utilizând addProperty așa cum se arată mai jos. În exemplul nostru, folosesc addProperty pentru a adăuga valoarea în grade Fahrenheit la cerere.

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

S-ar putea să te întrebi unde NAMESPACE vine de la. Este un șir static privat, definit în altă parte a aplicației, după cum puteți vedea mai jos.

 statică finală privată statică NAMESPACE = "http://www.w3schools.com/webservices/";

Pasul 3: Crearea solicitării

Pentru a trimite solicitarea serviciului web, trebuie să creați o solicitare de transport HTTP. Vom folosi HttpTransportSE clasa (org.ksoap2.transport.HttpTransportSE) pentru asta. Uitați-vă la exemplul de mai jos.

 HttpTransportSE ht = getHttpTransportSE ();

După cum probabil ați ghicit, getHttpTransportSE este o altă metodă de ajutor și vă permite să creați rapid un obiect de transport HTTP. Este mai puțin obositor să creați un obiect de transport HTTP de fiecare dată când efectuați un apel de serviciu web. Uitați-vă la implementarea de mai jos. Pentru a crea un HttpTransportSE exemplu, avem nevoie doar de adresa URL de bază a serviciului web, care este un alt șir static privat, după cum puteți vedea mai jos.

 finală privată HttpTransportSE getHttpTransportSE () HttpTransportSE ht = nou HttpTransportSE (Proxy.NO_PROXY, MAIN_REQUEST_URL, 60000); ht.debug = true; ht.setXmlVersionTag (“"); retur ht;
 static final final static MAIN_REQUEST_URL = "http://www.w3schools.com/webservices/tempconvert.asmx";

În getHttpTransportSE, de asemenea, configuram HttpTransportSE obiect. Trecând Proxy.NO_PROXY ca fiind primul argument al constructorului, specificăm că nu este folosit niciun proxy pentru cerere. Al treilea argument al constructorului stabilește intervalul de timp al sesiunii în milisecunde. Pentru a face depanarea mai ușoară, am setat și obiectul depanare proprietate la Adevărat. Orice probleme care apar sunt logate în LogCat.

Pasul 4: Trimiterea cererii

Este timpul să trimiteți solicitarea SOAP serviciului web. Facem acest lucru prin HTTP folosind obiectele de transport și plicuri pe care le-am creat mai devreme. Obiectul de transport HTTP are a apel , care este folosit pentru a adăuga acțiunea SOAP și plicul pe care l-am creat mai devreme.

 ht.call (SOAP_ACTION, plic);

SOAP_ACTION este un alt șir static privat, după cum puteți vedea mai jos.

 static final static SOAP_ACTION = "http://www.w3schools.com/webservices/FahrenheitToCelsius";

Pasul 5: Preluarea răspunsului

Când serviciul web trimite un răspuns înapoi, va trebui să îl procesăm și să rezolvăm orice eroare care ar putea fi aruncată. Apoi putem afișa datele către utilizator. Uitați-vă la fragmentul de cod de mai jos, în care extragem răspunsul din plicul de răspuns utilizând GetResponse metodă.

 SoapPrimitive resultsString = (SoapPrimitive) Învelișul envelope.getResponse ();

Eu folosesc a SoapPrimitive tip, dar puteți utiliza, de asemenea, a SoapObject exemplu dacă răspunsul de la serviciul web este XML. Puteți folosi apoi SoapObject exemplu pentru a obține valorile de răspuns și a le stoca într-o matrice. Apel toString pe SoapPrimitive obiect pentru a converti răspunsul la un șir simplu pentru al utiliza în aplicația dvs..

Uitați-vă la următorul fragment de cod în care am implementat o metodă getCelsiusConversion. Metoda acceptă o variabilă de șir ca singurul său argument. Variabila este adăugată ca proprietate solicitării SOAP așa cum am văzut mai devreme în acest tutorial. Variabila consumă metoda este valoarea în grade Fahrenheit. Această valoare este trimisă și procesată de serviciul web și primim înapoi un răspuns în grade Celsius.

 public String getCelsiusConversion (String fValue) Date șir = null; String methodname = "FahrenheitToCelsius"; SoapObject request = noul SoapObject (NAMESPACE, methodname); request.addProperty ("Fahrenheit", fValue); SoapSerializationPanel develope = getSoapSerializationEnvelope (cerere); HttpTransportSE ht = getHttpTransportSE (); încercați ht.call (SOAP_ACTION, plic); testHttpResponse (ht); SoapPrimitive resultsString = (SoapPrimitive) Învelișul envelope.getResponse (); Lista COOKIE_HEADER = (listă) ht.getServiceConnection () getResponseProperties (); pentru (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; 

Eu folosesc două șiruri de caractere getCelsiusConversion, date și METHODNAME. date variabila va fi returnată prin metoda după ce serviciul web a trimis un răspuns înapoi, în timp ce METHODNAME stochează numele de funcționare a serviciului web pe care îl vom viza și îl vom folosi în SoapObject instanță.

S-ar putea să fi observat pentru buclă în getCelsiusConversion, care nu face parte din pașii pe care i-am discutat mai devreme. Când lucrați cu servicii web mai complexe, este important să urmăriți sesiunea curentă. În fragmentul de mai jos, stochez sesiunea și ține evidența acesteia de fiecare dată când efectuez un apel către serviciul web.

 pentru (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. Crearea interfeței cu utilizatorul

Acum, că munca grea este în spatele nostru, este timpul să folosim ceea ce am creat. Pentru a încheia acest tutorial, vă voi arăta cum să creați o interfață de utilizator simplă pentru a converti o valoare în grade Fahrenheit la o valoare în grade Celsius și a afișa rezultatul pe dispozitivul utilizatorului.

Pasul 1: Creați aspectul

În primul rând, trebuie să creăm un fișier XML în proiect schemă pliant. Uitați-vă la fragmentul de cod de mai jos. Este o ilustrare simplă a unei interfețe de utilizator creată în XML.

    

Creăm trei componente, un Editează textul exemplu, a Buton exemplu, și a TextView instanță. Editează textul instanța este utilizată pentru a introduce și a capta valoarea pe care intenționăm să o trimitem serviciului web. Butonul este utilizat pentru a rula firul care invocă getCelsiusConversion iar afișarea textului afișează răspunsul pe care îl primim înapoi de la serviciul web.

Pasul 2: Creați activitatea

Următorul pas este crearea unui Activitate exemplu pentru a afișa aspectul pe care tocmai l-am creat. Uitați-vă la următorul fragment de cod. Acest lucru nu ar trebui să fie prea surprinzător dacă ați dezvoltat în trecut aplicații Android.

 pachet com.example.KsoapExemplu; importă android.app.Activity; import android.os.Bundle; clasa publica MyActivity extinde Activitatea / ** * Numit cand activitatea este creata pentru prima data. * / @Override publică void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); 

Acum, că ne-am ocupat de interfața cu utilizatorul, putem lega totul împreună. Uitați-vă la următorul fragment de cod pentru a vedea cum se face acest lucru.

 pachet com.example.KsoapExemplu; importă android.app.Activity; import android.os.Bundle; clasa publica MyActivity extinde Activitatea private TextView txt; private String celsius; / ** * Numit atunci când activitatea este creată pentru prima dată. * / @Override publică void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); Editare finală edt = (EditText) findViewById (R.id.value_to_convert); Buton btn = (buton) findViewById (R.id.convert); txt = (TextView) findViewById (R.id.answer); btn.setOnClickListener (noul View.OnClickListener () @Override public void onClick (Vizualizare v) if (edt.length ()> 0) getCelsius (edt.getText () toString ()); setText ("Valoarea Fahrenheit nu poate fi goală");); 

În onCreate, am pus un ascultător pe buton, BTN. De asemenea, verificăm că o valoare este introdusă în câmpul de introducere înainte de a o trimite la serviciul web. În butonul clic pe ascultător, valoarea a trecut getCelsius este distribuită la un șir deoarece serviciul web așteaptă o valoare de șir. Implementarea sistemului getCelsius nu este dificil, după cum puteți vedea mai jos.

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

În getCelsius, se creează un nou fir, care execută și creează o instanță a clasei care implementează getCelsiusConversion. Când primim un răspuns de la serviciul web, trimitem un mesaj unui manipulant pentru a actualiza interfața de utilizator afișând valoarea în grade Celsius către utilizator.

 public Handler Handler = nou Handler (nou Handler.Callback () @Override public boolean handleMessage (Message Message) comutare (msg.what) caz 0: txt.setText (celsius); ;

În handler, actualizăm TextView exemplu cu valoarea pe care am primit-o de la serviciul web. Uitați-vă la rezultatul final de mai jos.



Concluzie

Acum ar trebui să puteți adăuga biblioteca kSOAP la un proiect și să o utilizați pentru a face cereri către un serviciu web care utilizează protocolul SOAP. Lucrul cu biblioteca kSOAP va deveni mai ușor cu puțină practică și, prin urmare, vă încurajez să încercați serviciul de conversie Celsius-Fahrenheit. Încercați exemplul aplicației Android care face parte din tutorial pentru un pic de ajutor suplimentar.

Cod