Cómo llamar a un servicio web SOAP en Android [cerrado]

553

Tengo muchos problemas para encontrar buena información sobre cómo llamar a un servicio web SOAP / WSDL estándar con Android. Todo lo que he podido encontrar son documentos muy complicados y referencias a "kSoap2" y luego un poco sobre cómo analizarlo todo manualmente con SAX . Bien, está bien, pero es 2008, así que pensé que debería haber una buena biblioteca para llamar a los servicios web estándar.

El servicio web es básicamente uno creado en NetBeans . Me gustaría tener soporte IDE para generar las clases de fontanería. Solo necesito la forma más fácil / elegante de contactar un servicio web basado en WSDL desde un teléfono con Android.

BobbyShaftoe
fuente
Aquí hay un muy buen enlace sobre el uso de SOAP en Android: Cómo llamar al servicio web en Android usando SOAP
Jainendra
Si alguien previamente familiarizado con MS VS, usar Mono para Android resolverá muchos problemas con los servicios de datos y servicios web, todo es un desarrollo simple y rápido. Además, quien no está familiarizado con C # (código muy similar a Java), toda la biblioteca tiene los mismos métodos, algunas funciones reemplazadas en las propiedades, por lo que los nombres casi iguales y quién escribió antes en Java para Android pueden usar su experiencia para escribir C # de manera muy fácil código.
Eugene Bosikov
Eche un vistazo al siguiente enlace que tiene un ejemplo detallado sobre cómo acceder a un servicio web en Android usando Ksoap2 Accediendo
Fred Ondieki
Creo que esto es posible con Xamarin / C # usando .Net Core. ver blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri
Esta herramienta de Spring parece prometedora.
Louis

Respuestas:

245

Android no proporciona ningún tipo de biblioteca SOAP. Puede escribir el suyo o usar algo como kSOAP 2 . Como observa, otros han podido compilar y usar kSOAP2 en sus propios proyectos, pero no he tenido que hacerlo.

Google ha mostrado, hasta la fecha, poco interés en agregar una biblioteca SOAP a Android. Sospecho de esto es que prefieren apoyar las tendencias actuales de los servicios web hacia los servicios basados ​​en REST, y usar JSON como formato de encapsulación de datos. O, usando XMPP para mensajería. Pero eso es solo una conjetura.

Los servicios web basados ​​en XML son una tarea poco trivial en Android en este momento. Sin conocer NetBeans, no puedo hablar con las herramientas disponibles allí, pero estoy de acuerdo en que debería estar disponible una mejor biblioteca. Es posible que XmlPullParser lo salve de usar SAX, pero no sé mucho sobre eso.

foxxtrot
fuente
77
Sí, creo que tendré que construir un proxy REST. Parece bastante extraño que Google no tenga interés en proporcionar soporte SOAP. Probé el método kSoap, realmente ni siquiera es una alternativa seria. Es, en el mejor de los casos, un feo que requiere mucha búsqueda de grupos de noticias.
BobbyShaftoe
19
Probablemente, la razón es que SOAP es muy detallado y no cumple bien las limitaciones de la informática móvil.
Neil
92
Esta respuesta mejoraría si alguien pudiera sugerir la mejor alternativa para llamar a servicios web con una aplicación de Android. Una vez que las personas encuentran esta pregunta y la leen, eso es lo que la mayoría de ellos buscará.
MGOwen
44
El procesamiento SOAP también es intensivo en memoria y procesador en comparación con un formato más conciso como JSON.
Jeremy Edwards
3
@ MGOwen La mejor alternativa que puedo ver es un proxy. Implemente una interfaz REST-ful que represente los sobres SOAP a través de WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClientviene en el SDK de Android por defecto. Eso lo conectará a 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
fuente
55
Sí, esta sería la ruta donde tendría que analizar todo manualmente, no obtendría un enfoque orientado a objetos.
BobbyShaftoe
93
Quieres decir que no obtendrías un almuerzo gratis. El análisis manual no tiene nada que ver con OO. Podría analizar todo en papel con mi herramienta más avanzada como un lápiz HB1 y seguiría siendo OO.
Neil
8
Creo que, por OO, el autor se refería al enlace Java-XML. ¿Cuál sería su próximo paso en este enfoque para analizar la respuesta? ¿Y si tiene cientos de elementos, organizados en una estructura de árbol?
rustyx
12
Por cierto, esperaría al menos un HTTP POST no un GET si quieres tener suerte con SOAP. Además, ¿dónde están los encabezados de Aceptar y SOAPAction? Si realmente quiere ir al comando, se necesitará mucho más que estas 4 líneas para consumir un servicio SOAP.
rustyx
66
@NeilD: ¿Qué sucede si las circunstancias lo obligan a usar SOAP, por ejemplo, el servidor web usa SOAP y usted no tiene control sobre esto?
Bjarke Freund-Hansen
59

Es cierto que debido a su sobrecarga, SOAP no es la mejor opción para el intercambio de datos con dispositivos móviles. Sin embargo, puede encontrarse en una situación en la que no controla el formato de salida del servidor.

Entonces, si tiene que seguir con SOAP, hay una biblioteca kSOAP2 parcheada para Android aquí:
http://code.google.com/p/ksoap2-android/

Viktor Brešan
fuente
31

Para llamar a un servicio web desde un dispositivo móvil (especialmente en un teléfono Android), he usado una forma muy simple de hacerlo. No he utilizado ninguna API de cliente de servicio web para intentar llamar al servicio web. Mi enfoque es el siguiente para hacer una llamada.

  1. Cree una conexión HTTP simple utilizando la API estándar de Java HttpURLConnection.
  2. Formule una solicitud SOAP. (Puede ayudar a SOAPUI a realizar una solicitud SOAP).
  3. Establezca el indicador doOutPut como verdadero.
  4. Establezca valores de encabezado HTTP como longitud de contenido, tipo de contenido y agente de usuario. No olvide establecer el valor de la longitud del contenido, ya que es obligatorio.
  5. Escriba toda la solicitud SOAP en la secuencia de salida.
  6. Llame al método para hacer una conexión y recibir la respuesta (en mi caso usé getResonseCode ).
  7. Si recibió el código de respuesta como
    1. Significa que ha podido llamar al servicio web.
  8. Ahora tome una secuencia de entrada en la misma conexión HTTP y reciba el objeto de cadena. Este objeto de cadena es una respuesta SOAP.
  9. Si el código de respuesta es distinto de 200, tome un ErrorInput secuencia en el mismo objeto HTTP y reciba el error, si corresponde.
  10. Analice la respuesta recibida utilizando SAXParser (en mi caso) o DOMParaser o cualquier otro mecanismo de análisis.

He implementado este procedimiento para el teléfono Android y se está ejecutando con éxito. Puedo analizar la respuesta incluso si es más de 700 KB.

Priyanjan
fuente
30

SOAP es una tecnología inadecuada para usar en Android (o dispositivos móviles en general) debido a la sobrecarga de procesamiento / análisis que se requiere. Un servicio REST es una solución más ligera y eso es lo que sugeriría. Android viene con un analizador SAX, y es bastante trivial de usar. Si está absolutamente obligado a manejar / analizar SOAP en un dispositivo móvil, lo siento, el mejor consejo que puedo ofrecer es simplemente no usar SOAP.

jasonhudgins
fuente
2
Hay un lugar especial en el infierno para aquellos que obligan a los desarrolladores a usar servicios SOAP en lugar de REST API.
Hitesh Sahu el
24

Hace aproximadamente un año, estaba leyendo este hilo tratando de descubrir cómo hacer llamadas SOAP en Android: las sugerencias para construir el mío usando HttpClient me hicieron construir mi propia biblioteca SOAP para Android:

IceSoap

Básicamente, le permite crear sobres para enviar a través de una API Java simple, luego los analiza automáticamente en objetos que usted define a través de XPath ... por ejemplo:

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

Se convierte en:

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

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

Lo estaba usando para mi propio proyecto, pero pensé que podría ayudar a otras personas, así que pasé un tiempo separándolo y documentándolo. Realmente me encantaría si algunas de sus pobres almas que se topan con este hilo mientras buscan en Google "SOAP Android" podrían intentarlo y obtener algún beneficio.

Alex Gilleran
fuente
¿trabajó con la autenticación de sesión en IceSoap?
Adnen Chouibi
24

NO OLVIDE AGREGAR ksoap2.jar en su proyecto y también agregue el permiso de INTERNET en el archivo 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
fuente
HttpTransportSE, ¿dónde puedo obtener esta clase?
Noman
Hola, estoy usando tu código pero recibo el siguiente error, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; messages = anyType {MessagesTypeMessage = anyType {code = E00014; texto = Se requiere autenticación del comerciante .; }; }; }; } ¿Puedes ayudarme por favor?
Hasmukh
hi im Amit Amit también ..... U puede decirme cómo se compara la respuesta cuando llegamos la respuesta es correcta o no tan cómo y condiciones de lo que comprueben la respuesta ......
Amitsharma
¿Cómo agregar una matriz en XML de la propiedad de solicitud?
droidster.me
21

Tuve mi cita con KSOAP; Elegí un enfoque más simple.

Dado un archivo WSDL, cree plantillas de solicitud SOAP para cada solicitud (por ejemplo, usando la interfaz de usuario SOAP) y luego sustituya los valores que se pasarán en el código. PUBLICA estos datos en el punto final del servicio utilizando la instancia DefaultHttpClient y obtén la secuencia de respuesta. Analice el flujo de respuesta utilizando un analizador XML Pull.

Samuh
fuente
18

Puedes echar un vistazo a WSClient ++

Akash Kava
fuente
44
Finalmente una primera respuesta útil después de repetir kSoap o SAX
rustyx
Probé la versión demo. No funcionó para mí por un servicio simple. No vale la pena gastar tantos $$$$$.
Tushar
16

He creado un nuevo cliente SOAP para la plataforma Android. Está utilizando una interfaz generada por JAX-WS, pero hasta ahora es solo una prueba de concepto.

Si está interesado, pruebe el ejemplo y / o mire la fuente en AndroidSOAP .

Gábor AUTH
fuente
1
Tuve el placer de asistir a su presentación en JUM XVII. Budapest sobre estas cosas de Android. ¡Sigan con el buen trabajo!
pcjuzer
15

Si puedes, ve por JSON. Android viene con el paquete completo org.json

Yves
fuente
14

Llame a los métodos ksoap2 . Funciona muy bien

Configure los detalles, como

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

y luego para obtener el resultado hacer

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

Hace unos meses estaba trabajando con el servicio web jax-ws en la aplicación j2ee. Allí estábamos usando CXF wsdl2java para generar el código auxiliar del cliente WS a partir del archivo WSDL y con esos códigos auxiliares del cliente consumimos los servicios web. Hace unas semanas, cuando intentaba consumir el servicio web de la misma manera en la plataforma de Android, no pude, porque el jar de Android no tiene todas las clases de soporte "jax-ws". Esa vez no encontré ninguna herramienta de este tipo (si no fallé en google de manera eficiente) para cumplir con mi requisito:

  • Obtenga el código auxiliar del cliente del WSDL.
  • Y llame al Servicio con algún argumento (objeto de solicitud comercial de Java).
  • Obtenga el objeto comercial de respuesta.

Entonces, desarrollé mi propia herramienta de generación de clientes SOAP para Android . Donde tienes que seguir estos pasos:

  • Desde WSDL Obtenga WS Client Stub, póngalo en su proyecto.
  • Digamos para algunos servicios "ComplexOperationService", instanciar el servicio, obtener el puerto de punto final y llamar al método de servicio, y obtener la respuesta del servicio web:

p.ej:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • No necesita preocuparse por las clases de servicio / req / clases de respuesta o cualquier otra clase y el método también, ya que sabe que todo se genera a partir de WSDL.
  • Y, por supuesto, no necesita ser consciente de la acción / envoltura / espacio de nombres, etc. Simplemente llame al método como lo hacemos nosotros, los desarrolladores, todo el tiempo.
Haque astuto
fuente
¿Sabes cómo tratar con Date? Apache CXF lo traduce a XMLGregorianCalendar que no puedo crear en Android.
Martin Nuc
9

Estoy seguro de que podría hacer un pequeño cliente SOAP con Axis . Instrucciones de instalación del eje .

branchgabriel
fuente
2
Eso funcionaría solo si axis fuera compatible con Android. No lo es (algo sobre los paquetes javax. * En las dependencias del eje).
PaulProgrammer
6

Siga estos pasos por el método SOAP

Desde el archivo WSDL,

  • crear plantillas de solicitud SOAP para cada solicitud.

  • Luego sustituya los valores que se pasarán en el código.

  • PUBLICA estos datos en el punto final del servicio utilizando la instancia DefaultHttpClient.

  • Obtenga el flujo de respuesta y finalmente

  • Analice el flujo de respuesta utilizando un analizador XML Pull.

Manick
fuente
6

Para mí, la forma más fácil es usar una buena herramienta para generar todas las clases requeridas. Personalmente uso este sitio:

http://easywsdl.com/

Admite servicios web bastante complejos y utiliza ksoap2.

robocik
fuente
5

Sugeriría probar una herramienta muy útil que me ayudó mucho. Los muchachos que se encargaron de ese proyecto también fueron muy útiles. www.wsdl2code.com/

miroslavign
fuente
5

Si tiene problemas para llamar al servicio web en Android, puede usar el código siguiente para llamar al servicio web y obtener una respuesta. Asegúrese de que su servicio web devuelva la respuesta en formato de tabla de datos. Este código lo ayudará si utiliza datos de la base de datos de SQL Server . Si estás usando MYSQL necesita cambiar una cosa, simplemente reemplace la palabra NewDataSet de la oración obj2=(SoapObject) obj1.getProperty("NewDataSet");por 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 tiene algún problema con respecto a esto, puede escribirme.

Sachin D
fuente
4

Descargue y agregue el archivo de biblioteca SOAP con su proyecto Nombre de archivo: ksoap2-android-assembly-3.4.0-jar-with-dependencies

Limpie la aplicación y luego inicie el programa.

Aquí está el código para llamar al servicio 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";
    }

Los resultados pueden ser JSONObject o JSONArray or String

Para su mejor referencia, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Gracias.

lokesh m
fuente
3

Este es un ejemplo práctico de consumir servicios web SOAP en Android.

** Nota :: *** NO OLVIDES AGREGAR ksoap2.jar en tu proyecto y también agrega el permiso de INTERNET en el archivo 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
fuente
por favor
ayúdenme
3

Puede realizar una llamada de jabón como publicación sobre http con ciertos encabezados. Resolví esta pregunta sin bibliotecas adicionales como ksoap2. Aquí hay un código en vivo para obtener órdenes del servicio de jabones

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
fuente
por favor ayuda aquí stackoverflow.com/questions/41573829/…
Edijae Crusar
dos preguntas sobre esto: 1. ¿Cómo se llama esto desde la actividad principal? 2. ¿Cuál debería ser el valor de StringUrlShipment que se pasa como parámetro?
Tori
en el comentario anterior, ignore la pregunta # 1.
Tori
Desde la actividad principal, debe usar AsyncTask para llamar a este código. Dentro de esta clase AsyncTask, implemente doInBackground para lanzar este código
Lapenkov Vladimir
2

Para llamar a un servicio web SOAP desde Android, intente utilizar este cliente

NO OLVIDES AGREGAR ksoap2-android.jar en tu ruta de compilación de 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
fuente
@ Wajdi hh cómo comparar la respuesta res del resultado de la respuesta del donante: - éxito ..... "responce = 1 ~ Successfull" .... así que cómo comparamos ese resultado de la condición que son del lado del servidor ...... ..
Amitsharma
1

Agregar jabón Libaray (ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar ):

Cadena estática pública 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
fuente