I denne veiledningen lærer du hvordan du forbruker webtjenester ved hjelp av det populære kSOAP-biblioteket i et Android-program. kSOAP er et anerkjent bibliotek som er elsket av utviklere som har behov for å analysere WSDL (Web Service Definition Language) og SOAP (Simple Object Access Protocol) meldinger.
KSOAP-biblioteket er et elegant, lett og effektivt SOAP-klientbibliotek. Biblioteket er åpen kildekode, enkel å bruke, og det kan spare deg for å kople en tilpasset parser. Det er en av de mest pålitelige SOAP-bibliotekene som er tilgjengelige, og det oppdateres ofte, noe som er et godt tegn på ethvert åpen kildekodeprosjekt.
Det er ofte risikabelt å integrere åpen kildekode programvare (OSS) i et prosjekt, da det kan føre til uforutsette problemer på veien. Se alltid etter kommentarer og vurderinger fra andre utviklere som har brukt biblioteket. Hvis prosjektet ikke er under aktiv utvikling, kan det være bedre å se etter en alternativ løsning.
Målet med denne opplæringen er å gjøre deg kjent med kSOAP-biblioteket. For demonstrasjonsformål bruker vi en enkel webtjeneste fra W3Schools. Internett-tjenesten er en Fahrenheit til Celsius-omformer. Webtjenesten godtar en verdi i grader Fahrenheit og svarer med ekvivalentverdien i grader Celsius. Vi går gjennom eksemplet trinn for trinn. På slutten av denne opplæringen viser vi resultatet på brukerens enhet.
Start et nytt Android-prosjekt og konfigurer det som du vil. Bruk gjerne din favoritt IDE, men for denne opplæringen bruker jeg IntelliJ IDEA.
I prosjektets manifestfil må du angi at programmet får lov til å koble til internett. Vi skal også angi mål-SDK-versjonen, samt den minste SDK-versjonen. Ta en titt på manifestfilen som vises nedenfor.
Prøv alltid å bruke den siste stabile utgivelsen av et bibliotek eller oppgrader biblioteket du bruker i et program etter at en større oppdatering er utgitt. Det er god praksis å holde prosjektets avhengigheter oppdatert av ulike årsaker, for eksempel sikkerhet og feilrettinger. I denne opplæringen bruker vi versjon 3.1.1 av kSOAP-biblioteket, som du finner på prosjektets nedlastingsside. Etter at du har lastet ned kSOAP-biblioteket, legg det til i prosjektet ditt libs
mappe.
For å kunne bruke kSOAP-biblioteket i prosjektet ditt, må du legge det til i prosjektet. Jeg vil vise deg hvordan du legger til det ved hjelp av IntelliJ IDEA. Trinnene kan være litt annerledes hvis du bruker en annen IDE, men ideen er den samme. I IntelliJ IDEA, velg Prosjektstruktur ... fra Fil meny, åpne moduler ruten, klikk på i tillegg til knappen nederst i høyre rute, og velg bibliotek. Naviger til libs
mappe og velg kSOAP-biblioteket. Ta en titt på de to bildene nedenfor for avklaring.
KSOAP-biblioteket skal nå være synlig som en avhengighet av prosjektet ditt. Klikk avkrysningsboksen ved siden av kSOAP-biblioteket for å legge det til i prosjektet. Nå som vi har lagt til biblioteket i vårt prosjekt, er det på tide å sette den til bruk. Hvis du bruker IntelliJ IDEA, bør prosjektet ditt se ut som det som vises nedenfor.
Bruk av kSOAP-biblioteket til å konsumere en webtjeneste innebærer en rekke trinn. Men før vi dykker hodet først inn i bruk av kSOAP-biblioteket, er det nyttig å fortelle deg litt mer om webtjenesten vi skal bruke.
Besøk nettsiden til W3Schools webtjenesten som vi skal bruke i denne opplæringen. Du ser at det er to operasjoner, CelsiusToFahrenheit
og FahrenheitToCelsius
. Navnet på hver operasjon er selvforklarende. Webtjenestens URL er den grunnleggende nettadressen som vi skal bruke for å koble til webtjenesten.
Hvis du velger en operasjon på W3Schools nettsted, vises du et eksempel på forespørselen som webtjenesten forventer, samt svaret på webtjenesten. Ta en titt på kodestykket nedenfor, som er et eksempel på forespørsel som webtjenesten forventer. Vær oppmerksom på SOAPAction
i kodestykket. Vi vil bruke det litt senere i denne opplæringen.
POST /webservices/tempconvert.asmx HTTP / 1.1 Host: www.w3schools.com Content-Type: text / xml; charset = utf-8 Innholdslengde: lengde SOAPAction: "http://www.w3schools.com/webservices/FahrenheitToCelsius" string
Den neste kodestykket viser et eksempel på webtjenesten.
HTTP / 1.1 200 OK Innholdstype: tekst / xml; charset = utf-8 Innholdslengde: lengde string
Det første vi må gjøre er å lage en SOAP-konvolutt med SoapSerializationEnvelope
klasse (org.ksoap2.serialization.SoapSerializationEnvelope
), som du må importere fra kSOAP-biblioteket. Ta en titt på kodestykket under, der jeg har initialisert en forekomst av SoapSerializationEnvelope
klasse.
SoapSerializationEvelope envelope = getSoapSerializationEnvelope (forespørsel);
De getSoapSerializationEnvelope
Metoden er ikke definert i kSOAP-biblioteket. Det er en hjelpemetode som jeg har laget for å gjøre arbeidet med kSOAP-biblioteket litt enklere. Metoden returnerer SOAP-konvolutten som vi trenger for resten av eksemplet. Ta en titt på implementeringen av getSoapSerializationEnvelope
under.
privat endelig SoapSerializationEnvelope getSoapSerializationEvelope (SoapObject forespørsel) SoapSerializationEvelope envelope = ny SoapSerializationEvelope (SoapEnvelope.VER11); envelope.dotNet = true; envelope.implicitTypes = true; envelope.setAddAdornments (false); envelope.setOutputSoapObject (forespørsel); returnere konvolutt;
De getSoapSerializationEnvelope
metoden aksepterer a SoapObject
eksempel, som er forespørselen. Vi ser hvordan du lager forespørselen på bare noen få minutter. Når du lager en forekomst av SoapSerializationEnvelope
klasse, den SoapEnvelope
versjonen er satt ved å passere inn SoapEnvelope.VER11
, som forteller kSOAP-biblioteket som vi skal bruke SOAP 1.1. Vi setter konvoluttens dotNet
eiendom til ekte
som webtjenesten vi vil forbruke kjører på Microsofts. NET Framework.
envelope.dotNet = true;
Det er nå på tide å konfigurere SOAP-konvolutten ved å stille inn forespørselsinformasjonen. Begynn med å importere SoapObject
klasse (org.ksoap2.serialization.SoapObject
) og ta en titt på kodestykket nedenfor for å se hvordan du konfigurerer konvolutten. Vi begynner med å skape en forekomst av SoapObject
klasse, som krever to parametere, a namespace og a Metodenavn. Du kan legge til flere egenskaper til forespørselen ved hjelp av addProperty
metode som vist nedenfor. I vårt eksempel bruker jeg addProperty
å legge til verdien i grader Fahrenheit til forespørselen.
String methodname = "FahrenheitToCelsius"; SoapObject request = nytt SoapObject (NAMESPACE, metodenavn); request.addProperty ("Fahrenheit", fValue);
Du lurer kanskje på hvor NAMESPACE
kommer fra. Det er en privat statisk streng som er definert andre steder i programmet, som du kan se nedenfor.
privat statisk sluttstreng NAMESPACE = "http://www.w3schools.com/webservices/";
For å sende forespørselen til webtjenesten, må vi opprette en forespørsel om HTTP-transport. Vi bruker HttpTransportSE
klasse (org.ksoap2.transport.HttpTransportSE
) for dette. Ta en titt på eksemplet nedenfor.
HttpTransportSE ht = getHttpTransportSE ();
Som du kanskje har gjettet, getHttpTransportSE
er en annen hjelpemetode og lar deg raskt lage et HTTP-transportobjekt. Det gjør det mindre kjedelig å opprette et HTTP-transportobjekt hver gang du foretar et webtjenesteanrop. Ta en titt på implementeringen nedenfor. Å opprette en HttpTransportSE
For eksempel trenger vi bare nettadressen til webtjenesten, som er en annen privat statisk streng som du kan se nedenfor.
privat endelig HttpTransportSE getHttpTransportSE () HttpTransportSE ht = ny HttpTransportSE (Proxy.NO_PROXY, MAIN_REQUEST_URL, 60000); ht.debug = true; ht.setXmlVersionTag (""); return ht;
privat statisk sluttstreng MAIN_REQUEST_URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
I getHttpTransportSE
, Vi konfigurerer også HttpTransportSE
gjenstand. Ved å passere Proxy.NO_PROXY
Som det første argumentet til konstruktøren spesifiserer vi at ingen proxy brukes til forespørselen. Det tredje argumentet til konstruktøren setter tidsintervallet i millisekunder. For å gjøre debugging enklere, setter vi også objektet debug
eiendom til ekte
. Eventuelle problemer som dukker opp, er logget til LogCat.
Det er på tide å sende SOAP-forespørselen til webtjenesten. Vi gjør dette over HTTP ved hjelp av transport- og konvoluttobjekter vi opprettet tidligere. HTTP-transportobjektet har en anrop
metode, som brukes til å legge til SOAP-handlingen og konvolutten som vi opprettet tidligere.
ht.call (SOAP_ACTION, konvolutt);
SOAP_ACTION
er en annen privat statisk streng som du kan se nedenfor.
privat statisk sluttstreng SOAP_ACTION = "http://www.w3schools.com/webservices/FahrenheitToCelsius";
Når webtjenesten sender tilbake et svar, må vi behandle det og håndtere eventuelle feil som kan ha blitt kastet. Vi kan da vise dataene til brukeren. Ta en titt på kodestykket nedenfor, der vi trekker ut svaret fra svarkonsollen ved hjelp av GetResponse
metode.
SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse ();
Jeg bruker en SoapPrimitive
skriv inn, men du kan også bruke a SoapObject
eksempel hvis svaret fra webtjenesten er XML. Du kan da bruke SoapObject
eksempel for å få svarverdiene og lagre dem i en matrise. Anrop toString
på SoapPrimitive
objekt å konvertere svaret til en enkel streng for å bruke den i søknaden din.
Ta en titt på neste kodestykke der jeg har implementert en metode getCelsiusConversion
. Metoden aksepterer en strengvariabel som eneste argument. Variabelen legges som en eiendom til SOAP-forespørselen som vi så tidligere i denne opplæringen. Variabelen metoden bruker er verdien i grader Fahrenheit. Denne verdien sendes til og behandles av webtjenesten, og vi får tilbake et svar i grader Celsius.
offentlig String getCelsiusConversion (String fValue) String data = null; String methodname = "FahrenheitToCelsius"; SoapObject request = nytt SoapObject (NAMESPACE, metodenavn); request.addProperty ("Fahrenheit", fValue); SoapSerializationEvelope envelope = getSoapSerializationEnvelope (forespørsel); HttpTransportSE ht = getHttpTransportSE (); prøv ht.call (SOAP_ACTION, konvolutt); testHttpResponse (HT); SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse (); Liste COOKIE_HEADER = (Liste) ht.getServiceConnection (). GetResponseProperties (); for (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;
Jeg bruker to strenger i getCelsiusConversion
, data
og metode
. De data
variabel vil bli returnert av metoden etter at webtjenesten har sendt tilbake et svar, mens metode
lagrer navnet på driften av webtjenesten som vi skal målrette mot og brukes i SoapObject
forekomst.
Du har kanskje lagt merke til til
sløyfe inn getCelsiusConversion
, som ikke er en del av trinnene vi har diskutert tidligere. Når du arbeider med mer komplekse webtjenester, er det viktig å holde oversikt over gjeldende økt. I utsnittet nedenfor lagrer jeg økten og holder styr på det hver gang jeg ringer til webtjenesten.
for (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;
Nå som det harde arbeidet ligger bak oss, er det på tide å gjøre bruk av det vi nettopp har laget. For å konkludere denne opplæringen, viser jeg deg hvordan du lager et enkelt brukergrensesnitt for å konvertere en verdi i grader Fahrenheit til en verdi i grader Celsius og vise resultatet på brukerens enhet.
Først må vi opprette en XML-fil i prosjektets oppsett mappe. Ta en titt på kodestykket nedenfor. Det er en enkel illustrasjon av et brukergrensesnitt opprettet i XML.
Vi lager tre komponenter, en EditText
eksempel a Knapp
eksempel og a TextView
forekomst. De EditText
forekomst brukes til å legge inn og fange verdien som vi har til hensikt å sende til webtjenesten. Knappen brukes til å kjøre tråden som påkaller getCelsiusConversion
og tekstvisningen viser svaret vi kommer tilbake fra webtjenesten.
Det neste trinnet er å skape en Aktivitet
eksempel for å vise oppsettet vi nettopp har opprettet. Ta en titt på følgende kodestykke. Dette bør ikke være for overraskende hvis du har utviklet Android-applikasjoner før.
pakke com.example.KsoapExample; importer android.app.Activity; importere android.os.Bundle; offentlig klasse MyActivity utvider Aktivitet / ** * Kalt når aktiviteten er først opprettet. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Nå som vi har tatt vare på brukergrensesnittet, kan vi knytte alt sammen. Ta en titt på neste kodestykke for å se hvordan dette er gjort.
pakke com.example.KsoapExample; importer android.app.Activity; importere android.os.Bundle; offentlig klasse MyActivity utvider Aktivitet private TextView txt; privat streng celsius; / ** * Kalt når aktiviteten er først opprettet. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); Endelig 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 (Vis v) if (edt.length ()> 0) getCelsius (edt.getText (). toString ()); else txt. setText ("Fahrenheit-verdien kan ikke være tom."););
I onCreate
, Vi setter en lytter på knappen, btn
. Vi kontrollerer også at en verdi er oppgitt i inntastingsfeltet før du sender den til webtjenesten. I knappen klikker lytteren, verdien overføres til getCelsius
blir kastet til en streng som webtjenesten forventer en strengverdi. Gjennomføringen av getCelsius
er ikke vanskelig som du kan se nedenfor.
privat endelig tomt getCelsius (siste String toConvert) ny tråd (ny Runnable () @Override public void run () SoapRequests ex = nye SoapRequests (); celsius = ex.getCelsiusConversion (toConvert); handler.sendEmptyMessage (0); ).start();
I getCelsius
, en ny tråd er opprettet, som kjører og skaper en forekomst av klassen som implementerer getCelsiusConversion
. Når vi mottar et svar fra webtjenesten, sender vi en melding til en handler for å oppdatere brukergrensesnittet ved å vise verdien i grader Celsius til brukeren.
Offentlig Handler Handler = Ny Handler (Ny Handler.Callback () @Override Public Boolean HandlingMessage (Meldingsmelding) Switch (msg.what) Case 0: Txt.setText (Celsius); Break; Return false;) ;
I håndteringen oppdaterer vi TextView
eksempel med verdien vi mottok fra webtjenesten. Ta en titt på det endelige resultatet nedenfor.
Du bør nå kunne legge til kSOAP-biblioteket i et prosjekt og utnytte det til å stille forespørsler til en webtjeneste som bruker SOAP-protokollen. Å jobbe med kSOAP-biblioteket blir enklere med litt øvelse, og jeg oppfordrer deg derfor til å prøve Celsius til Fahrenheit-konverteringstjeneste. Prøv eksemplet Android-programmet som er en del av opplæringen, for litt ekstra hjelp.