Comment appeler un service Web SOAP sur Android [fermé]

553

J'ai beaucoup de mal à trouver de bonnes informations sur la façon d'appeler un service Web SOAP / WSDL standard avec Android. Tout ce que j'ai pu trouver, ce sont soit des documents très compliqués et des références à "kSoap2", puis un peu d'analyse syntaxique manuelle avec SAX . D'accord, c'est bien, mais c'est 2008, donc je me suis dit qu'il devrait y avoir une bonne bibliothèque pour appeler les services Web standard.

Le service Web est simplement un service créé dans NetBeans . J'aimerais avoir le support IDE pour générer les classes de plomberie. J'ai juste besoin du moyen le plus simple / le plus élégant pour contacter un service Web basé sur WSDL à partir d'un téléphone basé sur Android.

BobbyShaftoe
la source
Voici un très bon lien sur l'utilisation de SOAP dans Android: Comment appeler un service Web dans Android en utilisant SOAP
Jainendra
Si quelqu'un auparavant familiarisé avec MS VS, l'utilisation de Mono pour Android résoudra de nombreux problèmes avec les services de données et les services Web, tout est un développement simple et rapide. Également qui n'est pas familier avec C # (code très similaire à Java), toutes les bibliothèques ont les mêmes méthodes, certaines fonctions remplacées sur les propriétés, donc les noms sont presque les mêmes et qui a écrit auparavant sur Java pour Android peut très facilement utiliser leur expérience pour écrire en c # code.
Eugene Bosikov
Jetez un œil au lien ci-dessous, il contient un exemple détaillé sur l'accès à un service Web dans Android à l'aide de Ksoap2 Accès à un service
Fred Ondieki
Je pense que cela est possible avec Xamarin / C # en utilisant .Net Core. voir blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri
Cet outil de Spring semble prometteur.
Louis

Réponses:

245

Android ne fournit aucune sorte de bibliothèque SOAP. Vous pouvez soit écrire le vôtre, soit utiliser quelque chose comme kSOAP 2 . Comme vous le constatez, d'autres ont pu compiler et utiliser kSOAP2 dans leurs propres projets, mais je n'ai pas eu à le faire.

À ce jour, Google a montré peu d'intérêt à ajouter une bibliothèque SOAP à Android. Je soupçonne qu'ils préfèrent soutenir les tendances actuelles des services Web vers des services basés sur REST et utiliser JSON comme format d'encapsulation des données. Ou, en utilisant XMPP pour la messagerie. Mais ce n'est qu'une conjecture.

Les services Web basés sur XML sont une tâche légèrement non triviale sur Android pour le moment. Ne connaissant pas NetBeans, je ne peux pas parler des outils disponibles, mais je conviens qu'une meilleure bibliothèque devrait être disponible. Il est possible que XmlPullParser vous évite d'utiliser SAX, mais je n'en sais pas grand-chose.

foxxtrot
la source
7
Oui, je pense que je vais devoir créer un proxy REST. Il semble assez étrange que Google n'ait aucun intérêt à fournir un support SOAP. J'ai essayé la méthode kSoap, ce n'est vraiment même pas une alternative sérieuse. C'est, au mieux, un vilain had qui nécessite beaucoup de récurage des newsgroups.
BobbyShaftoe
19
La raison en est probablement que SOAP est très bavard et ne répond pas bien aux contraintes de l'informatique mobile.
Neil
92
Cette réponse serait améliorée si quelqu'un pouvait suggérer la meilleure alternative à l'appel de services Web avec une application Android. Une fois que les gens trouveront cette question et la liront, c'est ce que la plupart d'entre eux chercheront.
MGOwen
4
Le traitement SOAP est également gourmand en mémoire et en processeur par rapport à un format plus concis comme JSON.
Jeremy Edwards
3
@MGOwen La meilleure alternative que je puisse voir est un proxy. Implémentez une interface REST-ful qui utilise les enveloppes SOAP par proxy via WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClientvient dans le SDK Android par défaut. Cela vous permettra de vous connecter au WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
Neil
la source
5
Ouais, ce serait la route où je devrais tout analyser manuellement, je n'aurais pas une approche orientée objet.
BobbyShaftoe
93
Tu veux dire que tu n'aurais pas un déjeuner gratuit. L'analyse manuelle n'a rien à voir avec OO. Je pouvais tout analyser sur papier avec mon outil le plus avancé étant un crayon HB1 et ce serait toujours OO.
Neil
8
Je pense que par OO, l'auteur voulait dire liaison Java-XML. Quelle serait votre prochaine étape dans cette approche pour analyser la réponse? Et s'il a des centaines d'éléments, organisés en arborescence?
rustyx
12
BTW, je m'attendrais au moins à un HTTP POST et non à un GET si vous voulez avoir de la chance avec SOAP. Aussi, où sont les en-têtes Accept et SOAPAction? Si vous voulez vraiment faire du commando, il vous faudra bien plus que ces 4 lignes pour consommer un service SOAP.
rustyx
6
@NeilD: Que se passe-t-il si les circonstances vous obligent à utiliser SOAP, par exemple si le serveur Web utilise SOAP et que vous n'avez aucun contrôle sur cela?
Bjarke Freund-Hansen
59

Il est vrai qu'en raison de ses frais généraux, SOAP n'est pas le meilleur choix pour l'échange de données avec des appareils mobiles. Cependant, vous pourriez vous retrouver dans une situation dans laquelle vous ne contrôlez pas le format de sortie du serveur.

Donc, si vous devez vous en tenir à SOAP, il existe une bibliothèque kSOAP2 corrigée pour Android ici:
http://code.google.com/p/ksoap2-android/

Viktor Brešan
la source
31

Pour appeler un service Web à partir d'un appareil mobile (en particulier sur un téléphone Android), j'ai utilisé un moyen très simple de le faire. Je n'ai utilisé aucune API cliente de service Web pour essayer d'appeler le service Web. Mon approche est la suivante pour passer un appel.

  1. Créez une connexion HTTP simple à l'aide de l'API Java standard HttpURLConnection.
  2. Formulez une demande SOAP. (Vous pouvez aider SOAPUI à faire une demande SOAP.)
  3. Définissez l'indicateur doOutPut sur true.
  4. Définissez des valeurs d'en-tête HTTP comme la longueur du contenu, le type de contenu et l'agent utilisateur. N'oubliez pas de définir la valeur Content-length car c'est une obligation.
  5. Écrivez l'intégralité de la demande SOAP dans le flux de sortie.
  6. Appelez la méthode pour établir une connexion et recevoir la réponse (dans mon cas, j'ai utilisé getResonseCode).
  7. Si votre code de réponse reçu comme
    1. Cela signifie que vous avez réussi à appeler le service Web.
  8. Prenez maintenant un flux d'entrée sur la même connexion HTTP et recevez l'objet chaîne. Cet objet chaîne est une réponse SOAP.
  9. Si le code de réponse est différent de 200, prenez un ErrorInputflux sur le même objet HTTP et recevez l'erreur, le cas échéant.
  10. Analyser la réponse reçue en utilisant SAXParser (dans mon cas) ou DOMParaser ou tout autre mécanisme d'analyse.

J'ai implémenté cette procédure pour le téléphone Android et il fonctionne correctement. Je peux analyser la réponse même si elle est supérieure à 700 Ko.

Priyanjan
la source
30

SOAP est une technologie mal adaptée à une utilisation sur Android (ou sur les appareils mobiles en général) en raison de la surcharge de traitement / analyse requise. Un service REST est une solution plus légère et c'est ce que je suggère. Android est livré avec un analyseur SAX, et il est assez simple à utiliser. Si vous devez absolument manipuler / analyser SOAP sur un appareil mobile, je suis désolé pour vous, le meilleur conseil que je puisse offrir est simplement de ne pas utiliser SOAP.

jasonhudgins
la source
2
Il y a une place spéciale en enfer pour ceux qui forcent les développeurs à utiliser les services SOAP au lieu de l'API REST.
Hitesh Sahu
24

Il y a environ un an, je lisais ce fil en essayant de comprendre comment faire des appels SOAP sur Android - les suggestions pour créer la mienne en utilisant HttpClient m'ont amené à créer ma propre bibliothèque SOAP pour Android:

IceSoap

Fondamentalement, il vous permet de créer des enveloppes à envoyer via une simple API Java, puis de les analyser automatiquement en objets que vous définissez via XPath ... par exemple:

<Dictionary>
    <Id></Id>
    <Name></Name>
</Dictionary>

Devient:

@XMLObject("//Dictionary")
public class Dictionary {
    @XMLField("Id")
    private String id;

    @XMLField("Name")
    private String name;
}

Je l'utilisais pour mon propre projet, mais je pensais que cela pourrait aider d'autres personnes, alors j'ai passé un peu de temps à le séparer et à le documenter. J'adorerais vraiment que certaines de vos pauvres âmes qui tombent sur ce fil en recherchant "SOAP Android" puissent essayer et obtenir des avantages.

Alex Gilleran
la source
avez-vous travaillé avec l'authentification de session sur IceSoap?
Adnen Chouibi
24

N'OUBLIEZ PAS D'AJOUTER ksoap2.jar dans votre projet et ajoutez également l'autorisation INTERNET dans le fichier AndroidManifest

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}
Amit kumar
la source
HttpTransportSE où puis-je obtenir cette classe ??
Noman
Bonjour, j'utilise votre code mais j'obtiens l'erreur suivante, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = l'authentification du commerçant est requise .; }; }; }; } Pouvez-vous m'aider s'il vous plaît?
Hasmukh
salut Amit im aussi amit ..... Pouvez-vous me dire comment la réponse que nous comparons lorsque nous avons obtenu la réponse est réussie ou non, alors comment et quelles conditions pour vérifier la réponse ......
Amitsharma
comment ajouter un tableau au xml de la propriété de demande?
droidster.me
21

J'ai eu mon rendez-vous avec KSOAP; J'ai choisi une approche plutôt simple.

Étant donné un fichier WSDL, créez des modèles de demande SOAP pour chaque demande (par exemple: en utilisant l'interface utilisateur SOAP), puis remplacez les valeurs à transmettre dans le code. POSTEZ ces données au point de terminaison du service à l'aide de l'instance DefaultHttpClient et obtenez le flux de réponse. Analyser le flux de réponse à l'aide d'un analyseur XML Pull.

Samuh
la source
18

Vous pouvez jeter un œil à WSClient ++

Akash Kava
la source
4
Enfin une première réponse utile après avoir répété kSoap ou SAX
rustyx
J'ai essayé la version démo. N'a pas fonctionné pour moi pour un service simple. Cela ne vaut pas la peine de dépenser autant de $$$$$.
Tushar
16

J'ai créé un nouveau client SOAP pour la plateforme Android. Il utilise une interface générée par JAX-WS, mais ce n'est pour l'instant qu'une preuve de concept.

Si vous êtes intéressé, essayez l'exemple et / ou regardez la source sur AndroidSOAP .

Gábor AUTH
la source
1
J'ai eu le plaisir d'assister à votre présentation au JUM XVII. Budapest à propos de ce truc Android. Continuez votre bon travail!
pcjuzer
15

Si vous le pouvez, optez pour JSON. Android est livré avec le package org.json complet

Yves
la source
14

Appelez les méthodes ksoap2 . Cela fonctionne très bien.

Configurez les détails, comme

private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);

envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);

puis pour obtenir le résultat faire

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
DEVANG SHARMA
la source
11

Il y a quelques mois, je travaillais avec le service Web jax-ws dans l'application j2ee. Là, nous utilisions CXF wsdl2java pour générer le stub client WS à partir du fichier WSDL et avec ces stubs client, nous consommions les services web. Il y a quelques semaines, lorsque j'essayais de consommer le service Web de la même manière sur la plate-forme Android, je ne pouvais pas, car le pot Android ne contient pas toutes les classes de support "jax-ws". Cette fois, je n'ai pas trouvé un tel outil (si je n'ai pas échoué à google efficacement) pour répondre à mes besoins -

  • Obtenez le stub client du WSDL.
  • Et appelez le service avec un argument (objet de demande métier java).
  • Obtenez l'objet métier de réponse.

J'ai donc développé mon propre outil de génération de clients SOAP Android . Où vous devez suivre ces étapes:

  • Dans WSDL Get WS Client Stub, placez-le dans votre projet.
  • Dites pour certains services "ComplexOperationService", instanciez le service, obtenez le port de point de terminaison et appelez la méthode de service, et obtenez la réponse du service Web:

par exemple:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Vous n'avez pas à vous soucier de la classe de service / classes de demande / réponse ou de toute autre classe et de la méthode, car vous savez que tout est généré à partir de WSDL.
  • Et bien sûr, vous n'avez pas besoin d'être conscient de l'action de savon / enveloppe / espace de noms, etc. Appelez simplement la méthode comme nous, les développeurs le faisons tout le temps.
Asraful Haque
la source
Savez-vous comment gérer Date? Apache CXF le traduit en XMLGregorianCalendar que je ne peux pas créer dans Android.
Martin Nuc
9

Je suis sûr que vous pourriez créer un petit client SOAP avec Axis . Instructions d'installation de l'axe .

branchgabriel
la source
2
Cela ne fonctionnerait que si l'axe était compatible avec Android. Ce n'est pas le cas (quelque chose à propos des packages javax. * Dans les dépendances des axes).
PaulProgrammer
6

Suivez ces étapes par la méthode SOAP

À partir du fichier WSDL,

  • créer des modèles de demande SOAP pour chaque demande.

  • Remplacez ensuite les valeurs à transmettre dans le code.

  • POSTEZ ces données au point de terminaison du service à l'aide de l'instance DefaultHttpClient.

  • Obtenez le flux de réponse et enfin

  • Analyser le flux de réponse à l'aide d'un analyseur XML Pull.

Manick
la source
6

Pour moi, le moyen le plus simple est d'utiliser un bon outil pour générer toutes les classes requises. Personnellement j'utilise ce site:

http://easywsdl.com/

Il prend en charge des services Web assez complexes et utilise ksoap2.

robocik
la source
5

Je suggère de consulter un outil très utile qui m'a beaucoup aidé. Les gars qui s'occupent de ce projet ont également été très utiles. www.wsdl2code.com/

miroslavign
la source
5

Si vous rencontrez des problèmes pour appeler le service Web dans Android, vous pouvez utiliser le code ci-dessous pour appeler le service Web et obtenir une réponse. Assurez-vous que votre service Web renvoie la réponse au format Data Table .. Ce code vous aidera si vous utilisez des données de la base de données SQL Server . Si vous utilisez MYSQL, vous devez changer une chose, il suffit de remplacer le mot NewDataSet de la phrase obj2=(SoapObject) obj1.getProperty("NewDataSet");par DocumentElement

void callWebService(){ 

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

Si vous avez un problème à ce sujet, vous pouvez m'écrire ..

Sachin D
la source
4

Veuillez télécharger et ajouter le fichier de bibliothèque SOAP avec votre projet Nom du fichier: ksoap2-android-assembly-3.4.0-jar-with-dependencies

Nettoyez l'application, puis démarrez le programme

Voici le code pour l'appel de service SOAP

    String SOAP_ACTION = "YOUR_ACTION_NAME";
    String METHOD_NAME = "YOUR_METHOD_NAME";
    String NAMESPACE = "YOUR_NAME_SPACE";
    String URL = "YOUR_URL";
    SoapPrimitive resultString = null;

    try {
        SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
        addPropertyForSOAP(Request);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.dotNet = true;
        soapEnvelope.setOutputSoapObject(Request);

        HttpTransportSE transport = new HttpTransportSE(URL);

        transport.call(SOAP_ACTION, soapEnvelope);
        resultString = (SoapPrimitive) soapEnvelope.getResponse();

        Log.i("SOAP Result", "Result Celsius: " + resultString);
    } catch (Exception ex) {
        Log.e("SOAP Result", "Error: " + ex.getMessage());
    }
    if(resultString != null) {
        return resultString.toString();
    }
    else{
        return "error";
    }

Les résultats peuvent être JSONObject ou JSONArray Or String

Pour votre meilleure référence, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Merci.

lokesh s
la source
3

Ceci est un exemple pratique de consommation de services Web SOAP dans Android.

** Remarque :: *** N'OUBLIEZ PAS D'AJOUTER ksoap2.jar dans votre projet et ajoutez également l'autorisation INTERNET dans le fichier AndroidManifest *

public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
public final String METHOD_NAME = "FahrenheitToCelsius";
public final String PROPERTY_NAME = "Fahrenheit";
public final String SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
public final String SOAP_ADDRESS = "http://www.w3schools.com/webservices/tempconvert.asmx";


private class TestAsynk extends AsyncTask<String, Void, String> {

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        Toast.makeText(getApplicationContext(),
                String.format("%.2f", Float.parseFloat(result)),
                Toast.LENGTH_SHORT).show();
    }

    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                METHOD_NAME);
        request.addProperty(PROPERTY_NAME, params[0]);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;

        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(
                SOAP_ADDRESS);
        Object response = null;
        try {

            androidHttpTransport.call(SOAP_ACTION, envelope);
            response = envelope.getResponse();
            Log.e("Object response", response.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return response.toString();
    }
}
Arun
la source
aidez-moi s'il vous plaît sur ce problème stackoverflow.com/questions/41573829/…
Edijae Crusar
3

Vous pouvez effectuer un appel de savon en tant que publication sur http avec certains en-têtes. J'ai résolu cette question sans bibliothèques supplémentaires comme ksoap2 Voici le code en direct recevant les commandes du service soap

private static HashMap<String,String> mHeaders = new HashMap<>();

static {
    mHeaders.put("Accept-Encoding","gzip,deflate");
    mHeaders.put("Content-Type", "application/soap+xml");
    mHeaders.put("Host", "35.15.85.55:8080");
    mHeaders.put("Connection", "Keep-Alive");
    mHeaders.put("User-Agent","AndroidApp");
    mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
    int status=0;
    String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
            "   <soap:Header/>\n" +
            "   <soap:Body>\n" +
            "      <ser:GetAllOrdersOfShipment>\n" +
            "         <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
            "      </ser:GetAllOrdersOfShipment>\n" +
            "   </soap:Body>\n" +
            "</soap:Envelope>";
    StringBuffer chaine = new StringBuffer("");

    HttpURLConnection connection = null;
    try {
        URL url = new URL(stringUrlShipments);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
        connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");

        for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            connection.setRequestProperty(key,value);

        }

        connection.setRequestMethod("POST");
        connection.setDoInput(true);

        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(xmlstring.getBytes("UTF-8"));
        outputStream.close();

        connection.connect();
        status = connection.getResponseCode();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        Log.i("HTTP Client", "HTTP status code : " + status);
    }

    InputStream inputStream = null;
    try {
        inputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return inputStream;
}
Lapenkov Vladimir
la source
aidez-nous ici stackoverflow.com/questions/41573829/…
Edijae Crusar
deux questions à ce sujet: 1. Comment cela s'appelle-t-il de l'activité principale? 2. Quelle devrait être la valeur de StringUrlShipment transmise en tant que paramètre?
Tori
sur le commentaire ci-dessus, ignorez la question # 1.
Tori
De l'activité principale, vous devez utiliser AsyncTask pour appeler ce code. Dans cette classe AsyncTask, implémentez doInBackground pour lancer ce code
Lapenkov Vladimir
2

Pour appeler un service Web SOAP à partir d'Android, essayez d'utiliser ce client

N'OUBLIEZ PAS D'AJOUTER ksoap2-android.jar dans votre chemin de build java

public class WsClient {
    private static final String SOAP_ACTION = "somme";
    private static final String OPERATION_NAME = "somme";
    private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
    private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";

    public String caclculerSomme() {

        String res = null;
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
        request.addProperty("a", "5");
        request.addProperty("b", "2");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);

        try {
            httpTransport.call(SOAP_ACTION, envelope);
            String result = envelope.getResponse().toString();
            res = result;
            System.out.println("############# resull is :" + result);
        } catch (Exception exception) {
            System.out.println("########### ERRER" + exception.getMessage());
        }

        return res;
    }
}
Wajdi Hh
la source
@ Wajdi hh comment comparer la réponse de res du résultat de la réponse du donneur: - succès ..... "responce = 1 ~ Successfull" .... alors comment nous comparons ce résultat de la condition qui sont du côté serveur ...... ..
Amitsharma
1

Ajouter du savon Libaray ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar):

public static String Fn_Confirm_CollectMoney_Approval (

        HashMap < String, String > str1,
        HashMap < String, String > str2,
        HashMap < String, String > str3) {

    Object response = null;
    String METHOD_NAME = "CollectMoney";
    String NAMESPACE = "http://xxx/yyy/xxx";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    String SOAP_ACTION = "";

    try {

        SoapObject RequestParent = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapObject Request1 = new SoapObject(NAMESPACE, "req");

        PropertyInfo pi = new PropertyInfo();

        Set mapSet1 = (Set) str1.entrySet();

        Iterator mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            String keyValue = (String) mapEntry.getKey();

            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        mapSet1 = (Set) str3.entrySet();

        mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        SoapObject HeaderRequest = new SoapObject(NAMESPACE, "XXX");

        Set mapSet = (Set) str2.entrySet();

        Iterator mapIterator = mapSet.iterator();

        while (mapIterator.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            HeaderRequest.addProperty(pi);
        }

        Request1.addSoapObject(HeaderRequest);

        RequestParent.addSoapObject(Request1);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER10);

        soapEnvelope.dotNet = false;

        soapEnvelope.setOutputSoapObject(RequestParent);

        HttpTransportSE transport = new HttpTransportSE(URL, 120000);

        transport.debug = true;

        transport.call(SOAP_ACTION, soapEnvelope);

        response = (Object) soapEnvelope.getResponse();

        int cols = ((SoapObject) response).getPropertyCount();

        Object objectResponse = (Object) ((SoapObject) response)
                .getProperty("Resp");

        SoapObject subObject_Resp = (SoapObject) objectResponse;


        modelObject = new ResposeXmlModel();

        String MsgId = subObject_Resp.getProperty("MsgId").toString();


        modelObject.setMsgId(MsgId);

        String OrgId = subObject_Resp.getProperty("OrgId").toString();


        modelObject.setOrgId(OrgId);

        String ResCode = subObject_Resp.getProperty("ResCode").toString();


        modelObject.setResCode(ResCode);

        String ResDesc = subObject_Resp.getProperty("ResDesc").toString();


        modelObject.setResDesc(ResDesc);

        String TimeStamp = subObject_Resp.getProperty("TimeStamp")
                .toString();


        modelObject.setTimestamp(ResDesc);

        return response.toString();

    } catch (Exception ex) {

        ex.printStackTrace();

        return null;
    }

}
Mani
la source