¿Cómo pasar el parámetro a un webservice usando ksoap2?

Estoy utilizando Eclipse IDE para desarrollar una aplicación para Android. Estoy intentando conectarse a un servicio web .net. Estoy usando ksoap2 versión 2.3

Cuando estoy llamando a un webmethod sin parámetros, funciona bien. Cuando llego a pasar un parámetro al webmethod, obtengo null (mientras depura el servicio web que descubrí) y obtengo un nulo del método web en el código del lado del cliente.

Código:

package com.examples.hello; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.PropertyInfo; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import org.ksoap2.transport.HttpTransportSE; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class HelloActivity extends Activity { /** Called when the activity is first created. */ private static final String SOAP_ACTION = "http://Innovation/HRService/stringBs"; private static final String METHOD_NAME = "stringBs"; private static final String NAMESPACE = "http://Innovation/HRService/"; private static final String URL = "http://196.205.5.170/mdl/hrservice.asmx"; TextView tv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); tv=(TextView)findViewById(R.id.text1); call(); } public void call() { try { SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //PropertyInfo PI = new PropertyInfo(); //request.addProperty("a", "myprop"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet=true; envelope.encodingStyle = SoapSerializationEnvelope.XSD; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); Object result = (Object)envelope.getResponse(); String results = result.toString(); tv.setText( ""+results); } catch (Exception e) { tv.setText(e.getMessage()); } } } 

¿Por qué obtengo la respuesta nula, ¿cómo puedo pasar un parámetro a un servicio web usando ksoap2?

En lugar de

  request.addProperty("a", "myprop"); 

Intenta usar

  request.addProperty("arg0", "myprop"); 

No estoy esperando en ksoap2, pero estoy bastante seguro de que esto establece el valor del primer parámetro a su función de servicio web. Ha funcionado perfectamente para mí.

Llamar a webservice pasando parámetros de j2me

 SoapObject request = new SoapObject("http://www.webserviceX.NET", "GetCitiesByCountry"); String soapAction = "http://www.webserviceX.NET/GetCitiesByCountry"; request.addProperty("CountryName", "india"); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut = request; envelope.dotNet = true; HttpTransport ht = new HttpTransport("http://www.webservicex.net/globalweather.asmx"); ht.debug = true; //System.err.println( ht.requestDump ); ht.call(soapAction,envelope); System.out.println("####################: " +envelope.getResponse()); //SoapObject result = (SoapObject)envelope.getResponse(); 

Trate de comentar la línea:

Envelope.dotNet = true;

Hice la misma cosa que usted hizo y cuando leí sobre esta característica que es un truco realmente feo, lo comenté para los propósitos de la prueba y mi parámetro pasó correctamente.

He estado trabajando con esto por 2 días ahora y finalmente conseguí la solución. Presento mi código completo y espero que esto ayude. Puede pasar parámetros y obtener respuesta.

Dentro del archivo WebService en .net C #:

 [WebService(Namespace = "http://something/webservice/v1")] [WebMethod] public DateTime[] Function(Guid organizationId, Guid categoryId) { return ...; } 

Dentro del código de Android:

 private final static String URL = "http://something/WebServices/WebService.asmx"; private final static String NAMESPACE = "http://something/webservice/v1"; public ArrayList<Object> getSoapObject(String METHOD_NAME, String SOAP_ACTION, Map<String, String> parameters){ try { ArrayList<Object> sol = new ArrayList<Object>(); SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); if(parameters != null){ for (Entry<String, String> para : parameters.entrySet()) { request.addProperty(para.getKey(), para.getValue()); } } SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; envelope.setOutputSoapObject(request); Log.d("Body", envelope.bodyOut.toString()); HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); SoapObject result=(SoapObject)envelope.getResponse(); for(int i = 0; i < result.getPropertyCount(); i++){ sol.add(result.getProperty(i)); } return sol; } catch (Exception e) { e.printStackTrace(); return null; } } public void getMenuEndDate(String orgId, String categoryId){ Date startDate = null; Date endDate = null; HashMap<String, String> parameters = new HashMap<String, String>(); parameters.put("organizationId", orgId); parameters.put("categoryId", categoryId); ArrayList<Object> sol = getSoapObject("Function", "http://something/webservice/v1/Function", parameters); SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); try { startDate = (Date)dateFormatter.parse(sol.get(0).toString()); endDate = (Date)dateFormatter.parse(sol.get(1).toString()); } catch (ParseException e) { Log.d(TAG, "Exception i Date-Formatering"); e.printStackTrace(); } } 

Cosas a comprobar:

  • ¿Son los parámetros exactamente iguales a los esperados en el Servicio Web?
  • Compruebe si utiliza Trailing "/" para el espacio de nombres. Tenga lo mismo en su aplicación.

Usted tendrá que declarar el tipo de parámetro en el código del cliente:

 SoapObject request = new SoapObject("http://tempuri.org/", "mymethod"); PropertyInfo p = new PropertyInfo(); p.setName("param_name_from_webservice"); p.setValue(true); p.setType(Boolean.class); request.addProperty(p); 
  • Buscar usuarios en el host de pestañas android
  • Ventaja de almacenamiento de datos sin esquema en el almacenamiento de datos con el esquema
  • Soap Client en Android para acceder a las API de Salesforce
  • El método HttpTransportSe.call () tarda hasta un minuto en llamar al servicio web
  • OkHttp - Habilitar registros
  • Excepción; No se puede establecer la propiedad de la solicitud después de realizar la conexión; Se produce en Android Lollipop HTC M8
  • Servicio Web recibe parámetros nulos de la aplicación utilizando el método ksoap
  • El servicio Web devuelve SOAP cuando no se especifica el tipo de contenido
  • Analizar la respuesta de KSoap2 en android
  • Comprobación del sobre con Ksoap2 (Android)
  • ASIHTTPRequest equivalente para Android o cualquier gestor / envoltorio de solicitud HTTP?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.