Dans ce didacticiel, vous apprendrez à utiliser des services Web à l'aide de la bibliothèque kSOAP très répandue dans une application Android. kSOAP est une bibliothèque réputée, appréciée des développeurs qui ont besoin d'analyser les messages WSDL (Web Service Definition Language) et SOAP (Simple Object Access Protocol).
La bibliothèque kSOAP est une bibliothèque client SOAP élégante, légère et efficace. La bibliothèque est open source, facile à utiliser et vous évite d'avoir à coder un analyseur personnalisé. C'est l'une des bibliothèques SOAP les plus fiables actuellement disponibles et elle est fréquemment mise à jour, ce qui est un bon signe pour tout projet open source..
Il est souvent risqué d'intégrer un logiciel open source (OSS) dans un projet, car cela peut entraîner des problèmes imprévus à l'avenir. Recherchez toujours des commentaires et des critiques d’autres développeurs qui ont utilisé la bibliothèque. Si le projet n'est pas en développement actif, il peut être préférable de chercher une solution alternative.
L'objectif de ce tutoriel est de vous familiariser avec la bibliothèque kSOAP. À des fins de démonstration, nous utiliserons un simple service Web de W3Schools. Le service Web est un convertisseur de degrés Fahrenheit en degrés Celsius. Le service Web accepte une valeur en degrés Fahrenheit et répond avec la valeur équivalente en degrés Celsius. Nous allons parcourir l'exemple pas à pas. À la fin de ce didacticiel, nous afficherons le résultat sur le périphérique de l'utilisateur..
Démarrez un nouveau projet Android et configurez-le à votre guise. N'hésitez pas à utiliser votre IDE préféré, mais pour ce tutoriel, j'utiliserai IntelliJ IDEA.
Dans le fichier manifeste du projet, vous devez spécifier que l'application est autorisée à se connecter à Internet. Nous allons également spécifier la version du SDK cible ainsi que la version minimale du SDK. Jetez un coup d'œil au fichier manifeste ci-dessous.
Essayez toujours d'utiliser la dernière version stable d'une bibliothèque ou de mettre à niveau la bibliothèque que vous utilisez dans une application après la publication d'une mise à jour majeure. Il est recommandé de mettre à jour les dépendances d'un projet pour diverses raisons, telles que la sécurité et les corrections de bugs. Dans ce tutoriel, nous utiliserons la version 3.1.1 de la bibliothèque kSOAP, que vous trouverez sur la page de téléchargement du projet. Après avoir téléchargé la bibliothèque kSOAP, ajoutez-la à celle de votre projet. libs
dossier.
Pour utiliser la bibliothèque kSOAP dans votre projet, vous devez l'ajouter à votre projet. Je vais vous montrer comment l'ajouter en utilisant IntelliJ IDEA. Les étapes peuvent être légèrement différentes si vous utilisez un IDE différent, mais l’idée est la même. Dans IntelliJ IDEA, choisissez Structure du projet… du Fichier menu, ouvrez le Modules volet, cliquez sur le plus bouton en bas du volet de droite, puis sélectionnez bibliothèque. Accédez au libs
dossier et sélectionnez la bibliothèque kSOAP. Jetez un coup d'œil aux deux images ci-dessous pour plus de précisions.
La bibliothèque kSOAP devrait maintenant être visible en tant que dépendance de votre projet. Cochez la case en regard de la bibliothèque kSOAP pour l'ajouter à votre projet. Maintenant que nous avons ajouté la bibliothèque à notre projet, il est temps de la mettre à profit. Si vous utilisez IntelliJ IDEA, votre projet devrait ressembler à celui présenté ci-dessous..
L'utilisation de la bibliothèque kSOAP pour consommer un service Web implique un certain nombre d'étapes. Cependant, avant de plonger directement dans l'utilisation de la bibliothèque kSOAP, il est utile de vous en dire un peu plus sur le service Web que nous allons utiliser..
Visitez le site Web du service Web W3Schools que nous utiliserons dans ce didacticiel. Vous verrez qu'il y a deux opérations, CelsiusToFahrenheit
et FahrenheitToCelsius
. Le nom de chaque opération est explicite. L'URL du service Web est l'URL de base que nous utiliserons pour se connecter au service Web..
Si vous sélectionnez une opération sur le site Web W3Schools, un exemple de la demande attendue par le service Web s'affiche, ainsi que la réponse du service Web. Jetez un coup d'œil à l'extrait de code ci-dessous, qui constitue un exemple de demande attendu par le service Web. Portez une attention particulière à la SOAPAction
dans l'extrait de code. Nous allons l'utiliser un peu plus tard dans ce tutoriel.
POST /webservices/tempconvert.asmx HTTP / 1.1 Hôte: www.w3schools.com Type de contenu: text / xml; charset = utf-8 Content-Length: length SOAPAction: "http://www.w3schools.com/webservices/FahrenheitToCelsius" chaîne
L'extrait de code suivant montre un exemple de réponse du service Web..
HTTP / 1.1 200 OK Type de contenu: text / xml; charset = utf-8 Content-Length: longueur chaîne
La première chose à faire est de créer une enveloppe SOAP en utilisant le SoapSerializationEnvelope
classe (org.ksoap2.serialization.SoapSerializationEnvelope
), que vous devez importer de la bibliothèque kSOAP. Jetez un coup d’œil à l’extrait de code ci-dessous, dans lequel j’ai initialisé une instance du SoapSerializationEnvelope
classe.
SoapSerializationEnvelope envelope = getSoapSerializationEnvelope (demande);
le getSoapSerializationEnvelope
La méthode n'est pas définie dans la bibliothèque kSOAP. C'est une méthode d'assistance que j'ai créée pour faciliter un peu le travail avec la bibliothèque kSOAP. La méthode retourne l'enveloppe SOAP dont nous avons besoin pour le reste de l'exemple. Jetez un coup d’œil à la mise en œuvre de getSoapSerializationEnvelope
au dessous de.
soapSerializationEnvelope final privé getSoapSerializationEnvelope (demande SoapObject) SoapSerializationEnvelope envelope = new SoapSerializationEnvelope (SoapEnvelope.VER11); envelope.dotNet = true; envelope.implicitTypes = true; envelope.setAddAdornments (false); envelope.setOutputSoapObject (demande); enveloppe de retour;
le getSoapSerializationEnvelope
méthode accepte un SoapObject
instance, qui est la demande. Nous verrons comment créer la demande en quelques minutes. Lors de la création d'une instance du SoapSerializationEnvelope
classe, la SoapEnvelope
la version est définie en passant SoapEnvelope.VER11
, qui indique à la bibliothèque kSOAP que nous utiliserons SOAP 1.1. Nous mettons l'enveloppe point net
propriété à vrai
en tant que service Web que nous consommerons s'exécute sur le framework .NET de Microsoft.
envelope.dotNet = true;
Il est maintenant temps de configurer l'enveloppe SOAP en définissant les informations de la demande. Commencez par importer le SoapObject
classe (org.ksoap2.serialization.SoapObject
) et regardez l’extrait de code ci-dessous pour savoir comment configurer l’enveloppe. Nous commençons par créer une instance du SoapObject
classe, qui nécessite deux paramètres, un espace de noms et un nom de la méthode. Vous pouvez ajouter des propriétés supplémentaires à la demande à l'aide de la commande addProperty
méthode comme indiqué ci-dessous. Dans notre exemple, j'utilise addProperty
ajouter la valeur en degrés Fahrenheit à la demande.
String methodname = "FahrenheitToCelsius"; SoapObject request = new SoapObject (NAMESPACE, nom de la méthode); request.addProperty ("Fahrenheit", fValue);
Vous vous demandez peut-être où NOM ESPACE
vient de. C'est une chaîne statique privée définie ailleurs dans l'application, comme vous pouvez le voir ci-dessous..
private static final String NAMESPACE = "http://www.w3schools.com/webservices/";
Pour envoyer la demande au service Web, nous devons créer une demande de transport HTTP. Nous allons utiliser le HttpTransportSE
classe (org.ksoap2.transport.HttpTransportSE
) pour ça. Regardez l'exemple ci-dessous.
HttpTransportSE ht = getHttpTransportSE ();
Comme vous l'avez peut-être deviné, getHttpTransportSE
est une autre méthode d'assistance et vous permet de créer rapidement un objet de transport HTTP. Il est ainsi moins fastidieux de créer un objet de transport HTTP chaque fois que vous passez un appel de service Web. Jetez un oeil à sa mise en œuvre ci-dessous. Pour créer un HttpTransportSE
Par exemple, nous avons uniquement besoin de l'URL de base du service Web, qui est une autre chaîne statique privée, comme vous pouvez le voir ci-dessous..
final final privé HttpTransportSE getHttpTransportSE () HttpTransportSE ht = new HttpTransportSE (Proxy.NO_PROXY, MAIN_REQUEST_URL, 60000); ht.debug = true; ht.setXmlVersionTag (""); retour ht;
private static final String MAIN_REQUEST_URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
Dans getHttpTransportSE
, nous configurons également le HttpTransportSE
objet. En passant Proxy.NO_PROXY
en tant que premier argument du constructeur, nous spécifions qu'aucun proxy n'est utilisé pour la requête. Le troisième argument du constructeur définit le délai d'expiration de la session en millisecondes. Pour faciliter le débogage, nous définissons également la valeur de l'objet. déboguer
propriété à vrai
. Tous les problèmes qui apparaissent sont enregistrés dans LogCat..
Il est temps d'envoyer la demande SOAP au service Web. Nous le faisons sur HTTP en utilisant les objets de transport et d’enveloppe créés précédemment. L'objet de transport HTTP a un appel
méthode, utilisée pour ajouter l'action SOAP et l'enveloppe que nous avons créées précédemment.
ht.call (SOAP_ACTION, enveloppe);
SOAP_ACTION
est une autre chaîne statique privée, comme vous pouvez le voir ci-dessous.
private static final String SOAP_ACTION = "http://www.w3schools.com/webservices/FahrenheitToCelsius";
Lorsque le service Web renvoie une réponse, nous devons la traiter et gérer les erreurs éventuellement générées. Nous pouvons ensuite afficher les données à l'utilisateur. Jetez un coup d’œil à l’extrait de code ci-dessous dans lequel nous extrayons la réponse de l’enveloppe de réponse à l’aide du avoir une réponse
méthode.
SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse ();
J'utilise un SoapPrimitive
tapez, mais vous pouvez aussi utiliser un SoapObject
exemple si la réponse du service Web est XML. Vous pouvez ensuite utiliser le SoapObject
exemple pour obtenir les valeurs de réponse et les stocker dans un tableau. Appel toString
sur le SoapPrimitive
objet pour convertir la réponse en une simple chaîne pour l'utiliser dans votre application.
Regardez l'extrait de code suivant dans lequel j'ai implémenté une méthode. getCelsiusConversion
. La méthode accepte une variable de chaîne comme seul argument. La variable est ajoutée en tant que propriété à la demande SOAP, comme nous l'avons vu précédemment dans ce didacticiel. La variable que la méthode consomme est la valeur en degrés Fahrenheit. Cette valeur est envoyée et traitée par le service Web et nous recevons une réponse en degrés Celsius..
public String getCelsiusConversion (String fValue) String data = null; String methodname = "FahrenheitToCelsius"; SoapObject request = new SoapObject (NAMESPACE, nom de la méthode); request.addProperty ("Fahrenheit", fValue); SoapSerializationEnvelope envelope = getSoapSerializationEnvelope (demande); HttpTransportSE ht = getHttpTransportSE (); try ht.call (SOAP_ACTION, enveloppe); testHttpResponse (ht); SoapPrimitive resultsString = (SoapPrimitive) envelope.getResponse (); List COOKIE_HEADER = (Liste) ht.getServiceConnection (). GetResponseProperties (); pour (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;
J'utilise deux cordes dans getCelsiusConversion
, Les données
et nom de la méthode
. le Les données
variable sera renvoyée par la méthode après que le service Web a renvoyé une réponse, tandis que nom de la méthode
stocke le nom de l'opération du service Web que nous ciblons et qui est utilisé dans le SoapObject
exemple.
Vous avez peut-être remarqué le pour
boucle dans getCelsiusConversion
, ce qui ne fait pas partie des étapes dont nous avons discuté plus tôt. Lorsque vous travaillez avec des services Web plus complexes, il est important de garder une trace de la session en cours. Dans l'extrait ci-dessous, je stocke la session et la surveille chaque fois que j'appelle le service Web..
pour (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;
Maintenant que le dur travail est derrière nous, il est temps d'utiliser ce que nous venons de créer. Pour conclure ce tutoriel, je vais vous montrer comment créer une interface utilisateur simple permettant de convertir une valeur en degrés Fahrenheit en une valeur en degrés Celsius et d'afficher le résultat sur le périphérique de l'utilisateur..
Tout d’abord, nous devons créer un fichier XML dans le projet. disposition dossier. Regardez l'extrait de code ci-dessous. C’est une illustration simple d’une interface utilisateur créée en XML..
Nous créons trois composants, un Éditer le texte
par exemple, un Bouton
exemple, et un Affichage
exemple. le Éditer le texte
instance est utilisé pour entrer et capturer la valeur que nous avons l'intention d'envoyer au service Web. Le bouton est utilisé pour exécuter le fil qui appelle getCelsiusConversion
et la vue texte affiche la réponse que nous recevons du service Web.
La prochaine étape est de créer un Activité
exemple pour afficher la mise en page que nous venons de créer. Jetez un coup d'œil à l'extrait de code suivant. Cela ne devrait pas être trop surprenant si vous avez déjà développé des applications Android.
package com.example.KsoapExample; importer android.app.Activity; importer android.os.Bundle; Classe publique MyActivity étend Activity / ** * Appelé lors de la création initiale de l'activité. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main);
Maintenant que nous avons pris soin de l'interface utilisateur, nous pouvons tout relier. Jetez un coup d'œil au prochain extrait de code pour voir comment cela se fait..
package com.example.KsoapExample; importer android.app.Activity; importer android.os.Bundle; Classe publique MyActivity étend Activity private TextView txt; private String celsius; / ** * Appelé lorsque l'activité est créée pour la première fois. * / @Override public void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.main); final EditText edt = (EditText) findViewById (R.id.value_to_convert); Bouton btn = (Bouton) 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 ()) autre txt. setText ("La valeur Fahrenheit ne peut pas être vide."););
Dans onCreate
, on met un auditeur sur le bouton, btn
. Nous vérifions également qu'une valeur est entrée dans le champ de saisie avant de l'envoyer au service Web. Dans le bouton écouteur, la valeur transmise à getCelsius
est converti en une chaîne car le service Web attend une valeur de chaîne. L'implémentation de getCelsius
ce n'est pas difficile comme vous pouvez le voir ci-dessous.
final final privé getCelsius (final String toConvert) nouveau Thread (nouveau Runnable () @Override public void run () SoapRequests ex = nouveau SoapRequests (); celsius = ex.getCelsiusConversion (toConvert); handler.sendEmptyMessage (0); ).début();
Dans getCelsius
, un nouveau thread est créé, qui exécute et crée une instance de la classe qui implémente getCelsiusConversion
. Lorsque nous recevons une réponse du service Web, nous envoyons un message à un gestionnaire pour mettre à jour l'interface utilisateur en affichant la valeur en degrés Celsius à l'utilisateur..
gestionnaire public Handler = nouveau gestionnaire (nouveau Handler.Callback () @Override public boolean handleMessage (Message msg) commutateur (msg.what) cas 0: txt.setText (celsius); break; return false;) ;
Dans le gestionnaire, nous mettons à jour le Affichage
exemple avec la valeur que nous avons reçue du service Web. Regardez le résultat final ci-dessous.
Vous devriez maintenant pouvoir ajouter la bibliothèque kSOAP à un projet et l'utiliser pour adresser des demandes à un service Web utilisant le protocole SOAP. Travailler avec la bibliothèque kSOAP deviendra plus facile avec un peu de pratique et je vous encourage donc à essayer le service Web de conversion de Celsius à Fahrenheit. Essayez l'exemple d'application Android qui fait partie du tutoriel pour un peu d'aide supplémentaire.