java - from - soap android studio example
Cómo llamar a un servicio web SOAP en Android (26)
Estoy teniendo muchos problemas para encontrar buena información sobre cómo llamar a un servicio web estándar de SOAP / WSDL con Android. Todo lo que he podido encontrar son documentos muy complicados y referencias a "kSoap2" y luego un poco acerca de analizarlo todo manualmente con SAX . Está bien, está bien, pero es 2008, así que pensé que debería haber alguna 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 plomería. Solo necesito la forma más fácil / elegante de contactar con un servicio web basado en WSDL desde un teléfono basado en Android.
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);
}
}
}
Agregue Soap 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;
}
}
Android no proporciona ningún tipo de biblioteca SOAP. Puedes escribir el tuyo o usar algo como kSOAP 2 . Como ha notado, 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. Mi sospecha de esto es que prefieren apoyar las tendencias actuales de los servicios web hacia los servicios basados en REST y el uso de 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. Al no saber NetBeans, no puedo hablar con las herramientas disponibles allí, pero estoy de acuerdo en que debería haber una mejor biblioteca disponible. Es posible que XmlPullParser te evite usar SAX, pero no sé mucho sobre eso.
Creo que el servicio web Call SOAP de la aplicación de Android te ayudará mucho.
Descargue y agregue el archivo de la 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 o String
Para su mejor referencia, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/
Gracias.
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, es posible que se encuentre en una situación en la que no controle el formato de la salida del servidor.
Entonces, si tienes que seguir con SOAP, aquí hay una biblioteca kSOAP2 parcheada para Android:
http://code.google.com/p/ksoap2-android/
Espero que llamar a un servicio web desde Android ayude.
Este es un ejemplo práctico de consumir servicios web SOAP en Android.
** Nota: *** NO TE OLVIDES DE 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();
}
}
Estoy seguro de que podrías hacer un pequeño cliente SOAP con Axis . Instrucciones de instalación del eje .
Hace aproximadamente un año estaba leyendo este hilo tratando de averiguar cómo hacer llamadas SOAP en Android. Las sugerencias para crear mi propio uso de HttpClient me llevaron a crear mi propia biblioteca SOAP para Android:
Básicamente, le permite crear sobres para enviar a través de una simple API de Java, luego los analiza automáticamente en los objetos que 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 dediqué un tiempo a separarlo y documentarlo. Me encantaría que algunas de sus pobres almas que tropezaron con este hilo mientras buscaban en Google "SOAP Android" pudieran intentarlo y obtener algún beneficio.
Hace unos meses estaba trabajando con el servicio web jax-ws en la aplicación j2ee. Allí usábamos CXF wsdl2java para generar el código del cliente WS desde el archivo WSDL y con esos archivos del cliente consumimos los servicios web. Hace unas semanas, cuando intentaba consumir el servicio web de la misma forma que en la plataforma Android, no podía, porque el dispositivo Android no tiene todas las clases de apoyo "jax-ws". Esa vez no encontré ninguna herramienta de este tipo (si no fallaba en Google de manera eficiente) para cumplir con mi requisito:
- Obtener el talón del cliente de la WSDL.
- Y llame al Servicio con algún argumento (objeto de solicitud de negocio java).
- Obtener el objeto de negocio de respuesta.
Entonces, desarrollé mi propia herramienta de generación de cliente SOAP para Android . Donde tienes que seguir estos pasos:
- Desde WSDL Get WS Client Stub, póngalo en su proyecto.
- Diga por algún servicio "ComplexOperationService", cree una instancia del servicio, obtenga el puerto de Endpoint y llame al método de servicio, y obtenga 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 es necesario que se preocupe por las clases de clase de servicio / solicitud / respuesta o cualquier otra clase, y el método también, ya que sabe que todo se genera desde WSDL.
- Y, por supuesto, no necesita conocer la acción de jabón / envoltura / espacio de nombres, etc. Simplemente llame al método como lo hacemos nosotros, los desarrolladores todo el tiempo.
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 .
Llamar a los métodos ksoap2 . Funciona muy bien.
Configura 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();
Para llamar a un servicio web SOAP desde Android, intente usar este cliente
NO TE OLVIDES DE AGREGAR ksoap2-android.jar en tu ruta de compilación 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;
}
}
Para llamar a un servicio web desde un dispositivo móvil (especialmente en un teléfono con Android), he utilizado una forma muy sencilla 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.
- Cree una conexión HTTP simple utilizando la API estándar de Java
HttpURLConnection
. - Formar una solicitud de SOAP. (Puedes hacer la ayuda de SOAPUI para hacer una solicitud de SOAP).
- Establecer el indicador doOutPut como verdadero.
- 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.
- Escribe toda la solicitud SOAP en el flujo de salida.
- Llame al método para establecer una conexión y reciba la respuesta (en mi caso usé
getResonseCode
). - Si su código de respuesta recibido como
- Significa que tienes éxito para llamar al servicio web.
- Ahora tome un flujo de entrada en la misma conexión HTTP y reciba el objeto de cadena. Este objeto de cadena es una respuesta SOAP.
- Si el código de respuesta es distinto de 200, tome una secuencia
ErrorInput
en el mismo objeto HTTP y reciba el error, si lo hubiera. - 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 correctamente. Soy capaz de analizar la respuesta incluso si es más de 700 KB.
Para mí, la forma más fácil es usar una buena herramienta para generar todas las clases requeridas. Personalmente uso este sitio:
Es compatible con servicios web bastante complejos y utiliza ksoap2.
Puede realizar una llamada de jabón como publicación a través de http con ciertos encabezados. Resolví esta pregunta sin bibliotecas adicionales como ksoap2 Aquí está el código en vivo para obtener pedidos del servicio de jabón
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;
}
Puedes echar un vistazo a WSClient++
SOAP es una tecnología inadecuada para su uso 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 liviana 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 por usted, el mejor consejo que puedo ofrecer es que no use SOAP.
Si puede usar JSON, hay un documento técnico, un video y el código de muestra en Desarrollo de servicios de aplicaciones con servidores PHP y clientes de teléfonos Android .
Si puedes, ve por JSON. Android viene con el paquete completo org.json
Si tiene problemas con respecto a llamar al servicio web en Android, puede usar el siguiente código para llamar al servicio web y obtener respuesta. Asegúrese de que su servicio web devuelva la respuesta en Formato de tabla de datos. Este código le ayudará si usa datos de la base de datos de SQL Server . Si usa 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 tienes algún problema al respecto puedes escribirme ..
Sigue estos pasos por el método SOAP.
Desde el archivo WSDL,
crear plantillas de solicitud de SOAP para cada solicitud.
Luego sustituye los valores que se van a pasar en el código.
Publique estos datos en el punto final del servicio utilizando la instancia DefaultHttpClient.
Obtener el flujo de respuesta y finalmente
Analice el flujo de respuesta utilizando un analizador de extracción XML.
Tuve mi cita con KSOAP; Elegí un enfoque bastante más simple.
Dado un archivo WSDL, cree plantillas de Solicitud SOAP para cada Solicitud (por ejemplo: mediante la interfaz de usuario SOAP) y luego sustituya los valores que se pasarán en el código. Publique estos datos en el punto final del servicio utilizando la instancia DefaultHttpClient y obtenga la secuencia de respuesta. Analice el flujo de respuesta utilizando un analizador de extracción XML.
Yo sugeriría revisar una herramienta muy útil que me ayudó mucho. Los muchachos que se encargan de ese proyecto también fueron muy útiles. www.wsdl2code.com/
org.apache.http.impl.client.DefaultHttpClient
viene en el SDK de Android de forma predeterminada. Eso te conectará con el WSDL.
HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);