In deze zelfstudie leert u hoe u webservices kunt gebruiken met behulp van de populaire kSOAP-bibliotheek in een Android-toepassing. kSOAP is een gerenommeerde bibliotheek geliefd bij ontwikkelaars die de behoefte hebben om WSDL (Web Service Definition Language) en SOAP (Simple Object Access Protocol) berichten te ontleden.
De kSOAP-bibliotheek is een elegante, lichtgewicht en efficiënte SOAP-clientbibliotheek. De bibliotheek is open source, gebruiksvriendelijk en het kan u behoeden voor het coderen van een aangepaste parser. Het is een van de meer vertrouwde SOAP-bibliotheken die momenteel beschikbaar zijn en wordt regelmatig bijgewerkt, wat een goed teken is voor elk open-sourceproject.
Het is vaak riskant om open source software (OSS) in een project te integreren, omdat dit op de weg tot onvoorziene problemen kan leiden. Zoek altijd naar opmerkingen en recensies van andere ontwikkelaars die de bibliotheek hebben gebruikt. Als het project niet actief wordt ontwikkeld, is het wellicht beter om naar een alternatieve oplossing te zoeken.
Het doel van deze zelfstudie is om u vertrouwd te maken met de kSOAP-bibliotheek. Voor demonstratiedoeleinden gebruiken we een eenvoudige webservice van W3Schools. De webservice is een converter Fahrenheit to Celsius. De webservice accepteert een waarde in graden Fahrenheit en reageert met de equivalente waarde in graden Celsius. We zullen het voorbeeld stap voor stap bekijken. Aan het einde van deze tutorial tonen we het resultaat op het apparaat van de gebruiker.
Start een nieuw Android-project en configureer het zoals je wilt. Voel je vrij om je favoriete IDE te gebruiken, maar voor deze tutorial gebruik ik IntelliJ IDEA.
In het manifestbestand van het project moet u opgeven dat de toepassing verbinding mag maken met internet. We gaan ook de doel-SDK-versie en de minimale SDK-versie specificeren. Bekijk het manifestbestand dat hieronder wordt weergegeven.
Gebruik altijd de nieuwste stabiele versie van een bibliotheek of upgrade de bibliotheek die u gebruikt in een toepassing nadat een belangrijke update is uitgebracht. Het is een goede gewoonte om de afhankelijkheden van een project om verschillende redenen up-to-date te houden, zoals beveiliging en bugfixes. In deze zelfstudie gebruiken we versie 3.1.1 van de kSOAP-bibliotheek, die u kunt vinden op de downloadpagina van het project. Na het downloaden van de kSOAP-bibliotheek, voeg je deze toe aan je project libs
map.
Als u de kSOAP-bibliotheek in uw project wilt gebruiken, moet u deze aan uw project toevoegen. Ik zal je laten zien hoe je het kunt toevoegen met behulp van IntelliJ IDEA. De stappen kunnen enigszins verschillen als u een andere IDE gebruikt, maar het idee is hetzelfde. Kies in IntelliJ IDEA Projectstructuur ... van de het dossier menu, open de modules paneel, klik op de plus knop onder in het rechterdeelvenster en selecteer bibliotheek. Navigeer naar de libs
map en selecteer de kSOAP-bibliotheek. Bekijk de twee onderstaande afbeeldingen voor meer informatie.
De kSOAP-bibliotheek moet nu zichtbaar zijn als een afhankelijkheid van uw project. Klik op het selectievakje naast de kSOAP-bibliotheek om het aan uw project toe te voegen. Nu we de bibliotheek aan ons project hebben toegevoegd, is het tijd om het in gebruik te nemen. Als u IntelliJ IDEA gebruikt, moet uw project er ongeveer zo uitzien als hieronder wordt weergegeven.
Het gebruik van de kSOAP-bibliotheek om een webservice te gebruiken, omvat een aantal stappen. Voordat we echter eerst beginnen met het gebruik van de kSOAP-bibliotheek, is het handig om u wat meer te vertellen over de webservice die we gaan gebruiken.
Bezoek de website van de W3Schools-webservice die we in deze zelfstudie zullen gebruiken. Je zult zien dat er twee operaties zijn, CelsiusToFahrenheit
en FahrenheitToCelsius
. De naam van elke operatie spreekt voor zich. De URL van de webservice is de basis-URL die we gebruiken om verbinding te maken met de webservice.
Als u een bewerking op de W3Schools-website selecteert, wordt een voorbeeld weergegeven van het verzoek dat de webservice verwacht, evenals het antwoord van de webservice. Bekijk het onderstaande codefragment, een voorbeeldverzoek dat de webservice verwacht. Besteed veel aandacht aan de SOAPAction
in het codefragment. We zullen het later in deze tutorial gebruiken.
POST /webservices/tempconvert.asmx HTTP / 1.1 Host: www.w3schools.com Inhoudstype: text / xml; charset = utf-8 Content-Length: length SOAPAction: "http://www.w3schools.com/webservices/FahrenheitToCelsius" draad
In het volgende codefragment wordt een voorbeeldantwoord van de webservice weergegeven.
HTTP / 1.1 200 OK Inhoudstype: tekst / xml; charset = utf-8 Inhoud-lengte: lengte draad
Het eerste dat we moeten doen is een SOAP-envelop maken met behulp van de SoapSerializationEnvelope
klas (org.ksoap2.serialization.SoapSerializationEnvelope
), die u uit de kSOAP-bibliotheek moet importeren. Bekijk het onderstaande codefragment, waarin ik een exemplaar van de. Heb geïnitialiseerd SoapSerializationEnvelope
klasse.
SoapSerialization Envelope envelope = getSoapSerializationEnvelope (request);
De getSoapSerializationEnvelope
methode is niet gedefinieerd in de kSOAP-bibliotheek. Het is een hulpmethode die ik heb gemaakt om het werken met de kSOAP-bibliotheek een beetje gemakkelijker te maken. De methode retourneert de SOAP-envelop die we nodig hebben voor de rest van het voorbeeld. Bekijk de implementatie van getSoapSerializationEnvelope
beneden.
private final SoapSerializationEnvelope getSoapSerializationEnvelope (SoapObject request) SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (SoapEnvelope.VER11); envelope.dotNet = true; envelope.implicitTypes = true; envelope.setAddAdornments (false); envelope.setOutputSoapObject (verzoek); terugkeer envelop;
De getSoapSerializationEnvelope
methode accepteert a SoapObject
bijvoorbeeld, dat is het verzoek. We zullen zien hoe we het verzoek in slechts enkele minuten kunnen maken. Bij het maken van een exemplaar van de SoapSerializationEnvelope
klas, de SoapEnvelope
versie wordt ingesteld door in te geven SoapEnvelope.VER11
, die de kSOAP-bibliotheek vertelt die we zullen gebruiken ZEEP 1.1. We plaatsen de envelop punt net
eigendom aan waar
omdat de webservice die we gebruiken draait op het .NET-framework van Microsoft.
envelope.dotNet = true;
Het is nu tijd om de SOAP-envelop te configureren door de aanvraaginformatie in te stellen. Begin met het importeren van de SoapObject
klas (org.ksoap2.serialization.SoapObject
) en bekijk het codefragment hieronder om te zien hoe de envelop moet worden geconfigureerd. We beginnen met het maken van een instantie van de SoapObject
klasse, waarvoor twee parameters nodig zijn, namespace en een methode naam. U kunt extra eigenschappen aan het verzoek toevoegen met behulp van de addProperty
methode zoals hieronder getoond. In ons voorbeeld gebruik ik addProperty
om de waarde in graden Fahrenheit toe te voegen aan het verzoek.
String methodname = "FahrenheitToCelsius"; SoapObject-aanvraag = nieuw SoapObject (NAMESPACE, methode-naam); request.addProperty ("Fahrenheit", fValue);
Je vraagt je misschien af waar NAMESPACE
komt van. Het is een eigen statische tekenreeks die elders in de toepassing is gedefinieerd, zoals u hieronder kunt zien.
private static final String NAMESPACE = "http://www.w3schools.com/webservices/";
Om de aanvraag naar de webservice te verzenden, moeten we een HTTP-transportaanvraag maken. We zullen de gebruiken HttpTransportSE
klas (org.ksoap2.transport.HttpTransportSE
) voor deze. Bekijk het onderstaande voorbeeld.
HttpTransportSE ht = getHttpTransportSE ();
Zoals je misschien al geraden, getHttpTransportSE
is een andere helpermethode waarmee u snel een HTTP-transportobject kunt maken. Het maakt het minder vervelend om een HTTP-transportobject te maken telkens wanneer u een webserviceaanvraag doet. Bekijk de implementatie hieronder. Om een te maken HttpTransportSE
We hebben bijvoorbeeld alleen de basis-URL van de webservice nodig. Dit is een andere statische privéstring, zoals u hieronder kunt zien.
privé-finale HttpTransportSE getHttpTransportSE () HttpTransportSE ht = nieuwe 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";
In getHttpTransportSE
, we configureren ook de HttpTransportSE
voorwerp. Door te passeren Proxy.NO_PROXY
als het eerste argument van de constructor, specificeren we dat er geen proxy wordt gebruikt voor het verzoek. Het derde argument van de constructor stelt de sessietime-out in milliseconden in. Om het debuggen eenvoudiger te maken, stellen we ook het object in debug
eigendom aan waar
. Eventuele problemen die worden weergegeven, worden vastgelegd in LogCat.
Het is tijd om de SOAP-aanvraag naar de webservice te verzenden. We doen dit via HTTP met behulp van de transport- en envelopobjecten die we eerder hebben gemaakt. Het HTTP-transportobject heeft een telefoontje
methode, die wordt gebruikt om de SOAP-actie en envelop die we eerder hebben gemaakt toe te voegen.
ht.call (SOAP_ACTION, envelope);
SOAP_ACTION
is een andere privé statische tekenreeks zoals u hieronder kunt zien.
private static final String SOAP_ACTION = "http://www.w3schools.com/webservices/FahrenheitToCelsius";
Wanneer de webservice een reactie terugstuurt, moeten we deze verwerken en eventuele fouten verwerken die zijn gegenereerd. We kunnen de gegevens dan aan de gebruiker tonen. Bekijk het onderstaande codefragment waarin we het antwoord uit de antwoordenvelop halen met behulp van de reactie terug krijgen
methode.
SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse ();
Ik gebruik een SoapPrimitive
type, maar u kunt ook een SoapObject
bijvoorbeeld als het antwoord van de webservice XML is. U kunt dan de SoapObject
om de responswaarden te krijgen en deze in een array op te slaan. telefoontje toString
op de SoapPrimitive
object om het antwoord om te zetten in een eenvoudige tekenreeks om het in uw toepassing te gebruiken.
Bekijk het volgende codefragment waarin ik een methode heb geïmplementeerd getCelsiusConversion
. De methode accepteert een stringvariabele als zijn enige argument. De variabele wordt als een eigenschap toegevoegd aan het SOAP-verzoek zoals we eerder in deze zelfstudie hebben gezien. De variabele die de methode gebruikt, is de waarde in graden Fahrenheit. Deze waarde wordt naar de webservice verzonden en verwerkt en we ontvangen een reactie in graden Celsius.
public String getCelsiusConversion (String fValue) String data = null; String methodname = "FahrenheitToCelsius"; SoapObject-aanvraag = nieuw SoapObject (NAMESPACE, methode-naam); request.addProperty ("Fahrenheit", fValue); SoapSerialization Envelope envelope = getSoapSerializationEnvelope (request); HttpTransportSE ht = getHttpTransportSE (); probeer ht.call (SOAP_ACTION, envelop); testHttpResponse (ht); SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse (); Lijst COOKIE_HEADER = (Lijst) ht.getServiceConnection (). GetResponseProperties (); voor (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;
Ik gebruik twee strings in getCelsiusConversion
, gegevens
en methodName
. De gegevens
variabele wordt geretourneerd door de methode nadat de webservice een antwoord heeft teruggestuurd, terwijl methodName
slaat de naam op van de werking van de webservice die we zullen targeten en wordt gebruikt in de SoapObject
aanleg.
Je hebt misschien het voor
loop in getCelsiusConversion
, wat geen deel uitmaakt van de stappen die we eerder hebben besproken. Bij het werken met complexere webservices is het belangrijk om de huidige sessie bij te houden. In het onderstaande fragment sla ik de sessie op en houd ik deze bij elke keer dat ik een oproep doe naar de webservice.
voor (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;
Nu het harde werk achter de rug is, is het tijd om gebruik te maken van wat we zojuist hebben gemaakt. Om deze tutorial af te sluiten, laat ik je zien hoe je een eenvoudige gebruikersinterface kunt maken voor het converteren van een waarde in graden Fahrenheit naar een waarde in graden Celsius en het resultaat op het apparaat van de gebruiker kunt weergeven.
Eerst moeten we een XML-bestand maken in de projecten lay-out map. Bekijk het onderstaande codefragment. Het is een eenvoudige illustratie van een gebruikersinterface gemaakt in XML.
We creëren drie componenten, een Tekst bewerken
bijvoorbeeld, a Knop
bijvoorbeeld, en een Tekstweergave
aanleg. De Tekst bewerken
instance wordt gebruikt om de waarde in te voeren en vast te leggen die we naar de webservice willen verzenden. De knop wordt gebruikt om de thread uit te voeren die wordt aangeroepen getCelsiusConversion
en de tekstweergave toont het antwoord dat we krijgen van de webservice.
De volgende stap is het maken van een Activiteit
bijvoorbeeld om de lay-out weer te geven die we zojuist hebben gemaakt. Bekijk het volgende codefragment. Dit zou niet zo verwonderlijk moeten zijn als je eerder Android-applicaties hebt ontwikkeld.
pakket com.example.KsoapExample; import android.app.Activity; import android.os.Bundle; public class MyActivity breidt activiteit uit / ** * Wordt gebeld wanneer de activiteit voor het eerst wordt gemaakt. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Nu we de gebruikersinterface hebben verzorgd, kunnen we alles samenvoegen. Bekijk het volgende codefragment om te zien hoe dit is gebeurd.
pakket com.example.KsoapExample; import android.app.Activity; import android.os.Bundle; public class MyActivity breidt activiteit uit private TextView txt; privé String celsius; /** * Opgeroepen wanneer de activiteit voor het eerst is gemaakt. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); final EditText edt = (EditText) findViewById (R.id.value_to_convert); Knop btn = (Knop) findViewById (R.id.convert); txt = (TextView) findViewById (R.id.answer); btn.setOnClickListener (nieuwe View.OnClickListener () @Override public void onClick (View v) if (edt.length ()> 0) getCelsius (edt.getText (). toString ()); else txt. setText ("Fahrenheit-waarde kan niet leeg zijn."););
In onCreate
, we zetten een luisteraar op de knop, BTN
. We controleren ook of een waarde is ingevoerd in het invoerveld voordat deze naar de webservice wordt verzonden. In de listener met de knopklik, de waarde die is doorgegeven aan getCelsius
wordt in een tekenreeks gegoten omdat de webservice een tekenreekswaarde verwacht. De implementatie van getCelsius
is niet moeilijk zoals je hieronder kunt zien.
private final void getCelsius (final String toConvert) new Thread (nieuw Runnable () @Override public void run () SoapRequests ex = new SoapRequests (); celsius = ex.getCelsiusConversion (toConvert); handler.sendEmptyMessage (0); ). start ();
In getCelsius
, er wordt een nieuwe thread gemaakt, die wordt uitgevoerd en een exemplaar maakt van de klasse die wordt geïmplementeerd getCelsiusConversion
. Wanneer we een antwoord van de webservice ontvangen, sturen we een bericht naar een handler om de gebruikersinterface te updaten door de waarde in graden Celsius voor de gebruiker weer te geven.
public Handler handler = new Handler (new Handler.Callback () @Override public Boolean handleMessage (Message msg) switch (msg.what) case 0: txt.setText (celsius); break; return false;) ;
In de handler werken we het Tekstweergave
bijvoorbeeld met de waarde die we van de webservice hebben ontvangen. Bekijk het eindresultaat hieronder.
U zou nu de kSOAP-bibliotheek aan een project kunnen toevoegen en deze gebruiken om aanvragen in te dienen bij een webservice die het SOAP-protocol gebruikt. Werken met de kSOAP-bibliotheek zal met een beetje oefening eenvoudiger worden en ik moedig je daarom aan om de Celsius to Fahrenheit-webservice voor conversie te proberen. Probeer het voorbeeld van de Android-applicatie dat deel uitmaakt van de tutorial voor een beetje extra hulp.