ksoap2 org.xmlpull.v1.xmlpullparserexception esperado error de start_tag

A continuación está mi código, que he escrito para validar las credenciales de inicio de sesión del usuario. El servicio web escrito usando .net

private static final String SOAP_ACTION = "http://tempuri.org/getCredentials"; private static final String OPERATION_NAME = "getCredentials"; private static final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/"; private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/WebSiteName/CommunicationInterface.asmx"; SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, OPERATION_NAME); request.addProperty("username",Username); request.addProperty("password", Password); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet = true; envelope.setOutputSoapObject(request); HttpTransportSE httptransport = new HttpTransportSE(SOAP_ADDRESS); try { httptransport.call(SOAP_ACTION, envelope); SoapPrimitive result = (SoapPrimitive) envelope.getResponse(); String value = result.toString(); value_LoginWS = value; val = value; login_status = Boolean.valueOf(result.toString()); Log.v("CS return value: -", result.toString()); return value; } catch (Exception e) { Log.v("Exception Soap" , e.toString()); } 

En la línea "httptransport.call(SOAP_ACTION, envelope)" recibo la exception dice

 "org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG  @1:7 in java.io.InputStreamReader@41afb3f0)" 

No tengo idea de qué se trata el error. Esta pieza de código funciona perfectamente para el emulador (cambiando el staticIP to 10.0.2.2:portNo ).

Por favor ayúdame a resolver este problema.

Gracias.

La solución a continuación se prueba y se usa para los servicios web de WCF

Si obtiene este error

 org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG  @1:7 in java.io.InputStreamReader@41afb3f0)" 

Entonces, las posibles posibilidades son que su código no pueda acceder al servicio web ya que no se le han proporcionado los valores correctos de

 METHOD_NAME=""; NAMESPACE =""; SOAP_ACTION =""; URL =""; 

ksoap2 mucho para encontrar estos valores básicos pero importantes para ejecutar ksoap2

 METHOD_NAME=""; NAMESPACE =""; SOAP_ACTION =""; URL =""; 

Hubo varios ejemplos que realmente me dijeron que la teoría detrás de este valor es cómo generarlos como sabio SOAP_ACTION = NAMESPACE + METHOD_NAME.

Y seguí experimentando con varias combinaciones sin resultado.

Un tipo como yo, que tiene poca experiencia con WebServices y Ksoap2 y que ha estado muy mal con JSON la mayor parte del tiempo, realmente se frusta, qué diablos son estos valores y cómo obtenerlos correctamente.

Nunca encontrará dificultades para descubrir estos valores después de seguir el procedimiento a continuación.

Ejecute su WebService

1. Servicio web

Le mostrará una ventana como esta para usted.

Imagen 1 webservice

2. WSDL

Ahora abra su archivo WSDL haciendo clic en el enlace marcado en la selección para ver su WSDL

Se verá algo así.

imagen 2 wsdl

3. Para obtener el espacio de nombres para el servicio web

Ahora busca la cadena ” Namespace ” usando Ctrl+F

Obtendrás algo como esto

imagen 3 espacio de nombres

Aquí notarás que tenemos two namespaces

 targetNamespace="http://tempuri.org/">  

ahora cuál considerar, lo averiguaremos más adelante en los siguientes pasos

Ahora, cuál usar, lo sabrá más tarde

4. Para obtener el nombre del método y su acción correspondiente de Soap

Busque su método al que desea acceder "PutRecipeImagesPost" en este caso

Imagen 4 Acción de jabón

Verá que también hay SOAP Action aquí para este método.

Como en la Soap action is NameSpace + Methodname y aquí podemos ver que usa "iscservices.dedicated.co.za" por lo que lo haremos como nuestro namespace

5. Para obtener URL

Busque la cadena "soap:address location"

mira la imagen de abajo

El valor de este atributo será tu URL

Así que eventualmente obtenemos todos nuestros valores requeridos.

valores según nuestro ejemplo

 METHOD_NAME="PutRecipeImagesPost"; NAMESPACE ="iscservices.dedicated.co.za"; SOAP_ACTION ="iscservices.dedicated.co.za/InterfaceiPhysioIntelWCFService/PutRecipeImagesPost"; URL ="http://10.0.2.2:51809/iPhysioIntelService.svc/second/"; 

Si no puede ver las instantáneas anteriores o no puede obtener los valores de estas en su WSDl entonces WebService deveoper al WebService deveoper que lo solucione.

Más tarde, cómo usar KSoap2

mira el siguiente fragmento

 SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME); //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server); //req.addProperty(KEY, VALUE); //Key : - parameter name that is there in URL of webservice //value:- value we want to send to the parameter req.addProperty("ImageData", data); req.addProperty("login", CommonStaticData.getusername()); req.addProperty("password",CommonStaticData.getpassword()); req.addProperty("recipeId",FileID); MarshalBase64 mbase = new MarshalBase64();// marshal is used to serialize the byte array SoapSerializationEnvelope envelop = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelop.bodyOut = req; envelop.encodingStyle = SoapSerializationEnvelope.ENC2001; envelop.dotNet = true; envelop.setOutputSoapObject(req); HttpTransportSE aht = new HttpTransportSE(URL); mbase.register(envelop); aht.call(SOAP_ACTION,envelop); 

La respuesta de @Azone es variadamente corect, pero realmente, si ksoap devuelve una respuesta como

esperado START_TAG {…} Sobre (posición: START_TAG <{...} ...

se refiere a necesitar algo diferente de lo que usa.

Por lo tanto, debe usar el mismo origen de espacio de nombres para START_TAG “soapenv”

la biblioteca ksoap2 usa el espacio de nombres predeterminado

  xmlns:v="http://www.w3.org/2003/05/soap-envelope" 

por lo que su servidor debe mantener la misma fuente

Ejemplo de tornado-webservices:

 self._envelope.setAttribute ('xmlns:soapenv', 'http://www.w3.org/2003/05/soap-envelope') 

o de la otra manera necesitas configurar ksoap como tu servidor

servidor:

 self._envelope.setAttribute ('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/') 

ksoap:

 envelope.env = "http://schemas.xmlsoap.org/soap/envelope/"; 

Si ha utilizado los valores de NAMESPACE , URL , SOAP_ACTION y METHOD_NAME como se describe en la respuesta de Azone pero sigue obteniendo el error, consulte la versión de SOAP en esta statement:

 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX); 

En mi caso, había usado SoapEnvelope.VER12 , y cuando lo cambié de nuevo a SoapEnvelope.VER11 , se resolvió el error.

Cómo encontrar la versión SOAP de WSDL:

Citando de esta respuesta :

SOAP 1.1 usa el espacio de nombres http://schemas.xmlsoap.org/wsdl/soap/

SOAP 1.2 usa el espacio de nombres http://schemas.xmlsoap.org/wsdl/soap12/

El wsdl puede definir operaciones bajo soap 1.1 y soap 1.2 al mismo tiempo en el mismo wsdl. Eso es útil si necesita evolucionar su wsdl para admitir una nueva funcionalidad que requiera soap 1.2 (por ejemplo, MTOM), en este caso no necesita crear un nuevo servicio sino simplemente evolucionar el original.

La respuesta a esta pregunta es que, en la cadena SOAP_ADDRESS, elimino la parte / WebSiteName y funciona bien. He probado esto en mi dispositivo Android. Funciona perfectamente.

La cadena corregida debe ser la siguiente:

 private static final String SOAP_ADDRESS = "http://myStaticIP:portNo/CommunicationInterface.asmx"; 

donde CommunicationInterface.asmx es el nombre del servicio web. otras variables estáticas permanecen iguales.

Nota: Esto se usa cuando el sitio web está alojado en IIS.