Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Ksoap2 org.xmlpull.v1.xmlpullparserexception error start_tag esperado

A continuación se muestra mi código, que he escrito para validar las credenciales de inicio de sesión del usuario. El servicio web escrito con .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)" tengo la exception diciendo

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

No tengo ni idea de cuál es el error. Este pedazo de código se trabaja perfectamente para el emulador (cambiando el staticIP to 10.0.2.2:portNo ).

Por favor ayúdame a resolver este problema.

Gracias.

  • Fuera de memoria en una asignación de bytes (Bitmap como String al servicio web con jabón)
  • AsyncTask HttpPost ejecutar falla en 3G, pero funciona en Wifi
  • App crash en el dispositivo HTC M8 con OS Lollipop para la llamada de servicio web
  • ¿Cómo pasar el parámetro a un webservice usando ksoap2?
  • Cómo pasar un valor enum a wcf webservice
  • Java.lang.noclassdeffounderror: org.ksoap2.serialization.SoapObject
  • Usando addMapping sin el atributo "i: type =" en ksoap2 para android
  • Comprobación del sobre con Ksoap2 (Android)
  • 4 Solutions collect form web for “Ksoap2 org.xmlpull.v1.xmlpullparserexception error start_tag esperado”

    Debajo de la solución se prueba y se utiliza para WCF Web Services

    Si está recibiendo este error

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

    Entonces, las posibles posibilidades son que su código no puede acceder al servicio web, ya que no se ha proporcionado con los valores correctos de

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

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

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

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

    Y seguí experimentando con varias combinaciones sin Resultado.

    Un tipo como yo que está teniendo poca experiencia con WebServices y Ksoap2 y que había woirked con JSON la mayor parte del tiempo realmente obtener frustated, lo que diablos estos valores son y cómo obtener correctamente.

    Usted nunca tendrá dificultades para encontrar estos valores después de pasar por el siguiente procedimiento.

    Ejecute su WebService

    1. WebService

    Le mostrará una ventana como esta a usted.

    Imagen 1 webservice

    2. WSDL

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

    Se parecerá algo así.

    Imagen 2 wsdl

    3. Para obtener espacio de nombres para el WebService

    Ahora busque la cadena " Namespace " usando Ctrl+F

    Usted conseguirá algo como esto

    Imagen 3 namespace

    Aquí te darás cuenta de que tenemos two namespaces

     targetNamespace="http://tempuri.org/"> <wsdl:import namespace="iscservices.dedicated.co.za" 

    Ahora cual a considerar nos encontraremos mas adelante en los siguientes pasos

    Ahora, cuál de ellos utilizará, se enterará más tarde

    4. Para obtener el nombre del método y su correspondiente SoapAction

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

    Imagen 4 Jabón Acción

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

    Al igual que en la Soap action is NameSpace + Methodname y aquí podemos ver su uso de "iscservices.dedicated.co.za" por lo que lo mismo vamos a finalizar como nuestro namespace

    5. Para obtener la URL

    Busque la cadena "soap:address location"

    Ver la imagen de abajo

    El valor de este atributo será su 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 luego WSDl al WebService deveoper para solucionarlo.

    Más adelante sobre cómo usar KSoap2

    Vea 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 diversa corect, pero realmente, si ksoap devuelve una respuesta como

    Esperado START_TAG {…} Sobre (posición: START_TAG <{…} …

    Se refiere a la necesidad de algo diferente de lo que se utiliza.

    Así que necesitas usar la misma fuente de espacio de nombres para START_TAG "soapenv"

    La biblioteca ksoap2 utiliza 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

    Tornado-webservices ejemplo:

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

    O la otra forma que necesita configurar ksoap como su 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 tal como se describe en la respuesta de Azone pero sigue recibiendo el error, compruebe la versión de SOAP en esta declaración:

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VERXX); 

    En mi caso, había utilizado el SoapEnvelope.VER12 , y cuando lo cambié de nuevo a SoapEnvelope.VER11 , el error fue resuelto.

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

    Citando esta respuesta :

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

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

    El wsdl es capaz de definir las operaciones bajo jabón 1.1 y jabón 1.2 al mismo tiempo en el mismo wsdl. Eso es útil si necesita evolucionar su wsdl para soportar una nueva funcionalidad que requiere jabón 1.2 (por ejemplo, MTOM), en este caso usted no necesita crear un nuevo servicio, sino simplemente evolucionar el original.

    La respuesta a esta pregunta como lo averiguo es, en la cadena SOAP_ADDRESS, quitar la parte / WebSiteName y funciona bien. He probado esto en mi dispositivo androide. Funciona perfectamente.

    La cadena corregida debe ser como sigue:

     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: Se utiliza cuando el sitio web está alojado en IIS.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.