webservice - web service soap java tutorial




Comment appeler un service Web SOAP sur Android (18)

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);
        }

    }
}

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 est soit des documents très compliqués et des références à "kSoap2" et ensuite un peu à propos de l'analyse manuelle avec SAX . OK, c'est bien, mais c'est en 2008, donc j'ai pensé qu'il devrait y avoir une bonne bibliothèque pour appeler les services web standard.

Le service Web est simplement créé dans NetBeans . Je voudrais avoir un support IDE pour générer les classes de plomberie. J'ai juste besoin de la manière la plus simple / la plus élégante de contacter un service Web basé sur WSDL partir d'un téléphone basé sur Android.


Ajouter Soap ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar ):

Chaîne publique statique 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;
    }

}

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

Mettre en place 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);

et ensuite pour obtenir le résultat

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();

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

** Note :: *** 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();
    }
}

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 du client WS à partir du fichier WSDL et avec ces stubs client nous consommions les services web. Il y a quelques semaines, quand j'essayais de consommer le service Web de la même manière dans la plate-forme android je ne pouvais pas, parce que le pot androïde n'a pas tous les classes de soutien "jax-ws" en elle. Cette fois, je n'ai pas trouvé un tel outil (si je n'ai pas échoué à Google efficacement) pour répondre à mes exigences -

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

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

  • A partir de WSDL, obtenez WS Stub Client, mettez-le dans votre projet.
  • Dire pour certains services "ComplexOperationService", Instanciation du service, Obtenir le port Endpoint et appeler la méthode de service, et obtenir 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 besoin de vous soucier des classes de classe de service / req / response ou de toute autre classe et de la méthode, comme vous le savez, elles sont toutes générées à partir de WSDL.
  • Et bien sûr, vous n'avez pas besoin d'être au courant de l'action soap / envelope / namespace, etc. Appelez simplement la méthode comme nous, développeurs le faisons tout le temps.

Il ya environ un an, je lisais ce fil essayant de comprendre comment faire des appels SOAP sur Android - les suggestions pour construire mon propre en utilisant HttpClient ont abouti à moi construire ma propre bibliothèque SOAP pour Android:

IceSoap

Fondamentalement, il vous permet de créer des enveloppes à envoyer via une simple API Java, puis les analyse 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é du temps à le séparer et à le documenter. J'adorerais vraiment que certaines de vos âmes pauvres qui trébuchent sur ce sujet en faisant des recherches sur "SOAP Android" puissent tenter le coup et en retirer un avantage.


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

Dans le cas d'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 à passer dans le code. POSTEZ ces données au point de terminaison du service à l'aide de l'instance DefaultHttpClient et récupérez le flux de réponse. Analyser le flux de réponses à l'aide d'un analyseur XML Pull.



Je suggère de vérifier 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/



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 compilation 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;
    }
}

Pour moi, 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 supporte des services web assez complexes et utilise ksoap2.


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



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 à passer 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éponses à l'aide d'un analyseur XML Pull.


Veuillez télécharger et ajouter un 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 ou String

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

Merci.



org.apache.http.impl.client.DefaultHttpClient est org.apache.http.impl.client.DefaultHttpClient 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);




wsdl