Pregunta

Tengo un código estándar para llamar a un .net webservice

consigo exception "org.xmlpull.v1.xmlpullparserexception expected start_tag" en la línea

transportSE.call(SOAP_ACTION,soapSerializationEnvelope);

Sin embargo, si llamo a la misma de un servicio web .NET code me sale una salida adecuada bien estructurada según se desee.

Parece que a partir principalmente kSOAP2, hay una salida definitiva de que se hace, pero cuando se va a analizar más w.r.t objetos SoapPrimitive, falla.

Entonces, ¿hay otra manera de ver la salida real (sobre SOAP real) recibida y después de análisis puede ser yo misma manera apropiada.

¿Fue útil?

Solución

Bueno, ahora que lo he resuelto mi problema original golpeó este!

Me encontró que ksoap2 no pudo analizar la respuesta ... específicamente org.kxml2.io.KXmlParser.require (tipo, espacio de nombres, nombre) lanzó la siguiente excepción.

WARN/System.err(2330): org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://www.w3.org/2001/12/soap-envelope}Envelope (position:START_TAG <h1>@1:4 in java.io.InputStreamReader@47ff3050) 

Tenga en cuenta que la etiqueta h1. Eso viene de <h1>404 Not Found</h1> ... así que sí, tenga en cuenta que su respuesta puede ser de un sitio web, pero no su servicio web:)

Espero que ayude alguien Un días

Otros consejos

Estoy investigando un problema similar que estoy teniendo. Me encontré con este comentario

Cuando uso SoapEnvelope.VER11, que funciona bien, pero cuando uso SoapEnvelope.VER12, me da error: "Org.xmlpull.v1.XmlPullParserException: espera: la START_TAG".

http://groups.google.com/group/android- desarrolladores / browse_thread / hilo / b585862b6e939fd2

Tal vez estamos teniendo problemas de compatibilidad con respecto a la versión de jabón. También se conecta a un punto de servicio de red es posible que necesite conjunto envelope.dotNet = true; .. pero es probable que hayas hecho esto

Me estaba esta excepción a la START_TAG pero en mi caso fue porque mis valores para

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

no fuera correcta.

Ahora Cómo averiguar los valores correctos de estos parámetros se puede Echa un vistazo a mi otra respuesta aquí

SoapObject req = new SoapObject(NAMESPACE,METHOD_NAME);
            //SoapObject req = new SoapObject(Namespace_Server,MethodName_Server);

    //req.addProperty("ImageData", Base64.encode(data));
    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);

Yo tenía casi el mismo error, mi excepción fue esta "posición: la START_TAG @ 2: 7"

pero me he fijado porque estaba nombrando de manera errónea un parámetro, el nombre debe ser exactamente como se especifica en el XSD.

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
     request.addProperty("arg0_java_lang_String", "Club");

en el addPropery método que estaba usando un nombre de parámetro incorrecto.


Después de asegurarse de la dirección URL de servicio web es alcanzable utilizando el siguiente código al observar la variable urlc.getResponseCode() para el código de respuesta, mientras que la alteración de la IP desde localhost, fijo, externa y, finalmente, a 10.0.2.2

public static boolean isNetworkAvailable() {
//http://stackoverflow.com/questions/1560788/how-to-check-internet-access-on-android-inetaddress-never-timeouts/4009133#comment24565402_4009133
        /* ConnectivityManager cm =
                    (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo netInfo = cm.getActiveNetworkInfo();
                if (netInfo != null && netInfo.isConnected()) {//netInfo.isConnectedOrConnecting()
                    return true;
                }
                return false;*/

//http://stackoverflow.com/questions/5474089/how-to-check-currently-internet-connection-is-available-or-not-in-android?rq=1             
                boolean connected = false;
                ConnectivityManager connectivityManager = (ConnectivityManager)_context.getSystemService(Context.CONNECTIVITY_SERVICE);
                    if(connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || 
                            connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED) {
                        //we are connected to a network
                        connected=true;
                        return connected;
                    }
                    else
                        {
                        connected=false;
                        return false;
                        }
    }

    public static boolean hasActiveInternetConnection() {
        if (isNetworkAvailable()) {
            try {
                //String url = "http://www.google.com",
                String url = "http://10.0.2.2:8089/UNIV_AXIS_DYN_WEB/services/ServiceMethods?wsdl",
                        proxy = "proxy.rss.jo",
                        port= "8080";
                URL server = new URL(url);
                Properties systemProperties = System.getProperties();
                /*systemProperties.setProperty("http.prosyHost",proxy);
                systemProperties.setProperty("http.prosyHost",port);*/
                HttpURLConnection urlc = (HttpURLConnection) (server.openConnection());
                urlc.setRequestProperty("User-Agent", "Test");
                urlc.setRequestProperty("Connection", "close");
                urlc.setConnectTimeout(500); 
                urlc.connect();
                System.out.println(urlc.getResponseCode());
                return (urlc.getResponseCode() == 200);
            } catch (IOException e) {
                Log.e(LOG_TAG, "Error checking internet connection", e);
                return false;
            }
        } else {
            Log.d(LOG_TAG, "No network available!");
            return false;
        }

    }

Para mí Tengo esta receta "no falta el carácter s en el siguiente"

[ERROR] Exception occurred while trying to invoke service method login org.apache.axis2.AxisFault: namespace mismatch require http://services.univ.rss found http://service.univ.rss

El resto de registro de Tomcat, etc

at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:190)
    at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:117)
    at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
    at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:181)
    at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:172)
    at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:146)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

Y sí después de trazar el LogCat no el registro º vísperas de registro del servidor Tomcat si el servicio fue probado por soapUI éxito, debe controlar todos los registros en cada prueba de cambio, que incluso olvidó en un primer momento para iniciar el servicio de base de datos para tener cuidado:)

El Jabón Llamar

public SoapObject SoapCall(Vector<PropertyInfo> propertyInfo)

    {       

         Integer parametersSize = propertyInfo.size();

         //Initialize soap request + add parameters
         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

         for(int i=0;i<parametersSize;i++)
         {
             request.addProperty(propertyInfo.get(i));
         }


        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        //envelope.dotNet = false; if service of type asmx .NET
        envelope.setOutputSoapObject(request);

        Log.d("App Log c ","c");

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            System.out.println(androidHttpTransport.getPort());
            // Make the soap call.
            //this is the actual part that will call the webservice
             androidHttpTransport.call(SOAP_ACTION, envelope);                      

             SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
             //Log.i("App Log 1 ", response.toString());

        } catch (Exception e) {
            e.printStackTrace(); 
        }

        // Get the SoapResult from the envelope body.       
        SoapObject result = (SoapObject)envelope.bodyIn;
        Log.i("App Log 2 ", result.toString());
        Log.i("App Log 2 ", result.getProperty(0).toString());

        return result;

    }


 Vector<PropertyInfo> vectorProperyInfo = new Vector<PropertyInfo>();

            PropertyInfo userProp = new PropertyInfo();
            userProp.setName("userName");
            userProp.setValue(username);
            userProp.setType(String.class);
            vectorProperyInfo.addElement(userProp);

            PropertyInfo passProp = new PropertyInfo();
            passProp.setName("pass");
            passProp.setValue(password);
            passProp.setType(String.class);
            vectorProperyInfo.addElement(passProp);

            SoapObject result = soapUtil.SoapCall(vectorProperyInfo);

           if (result != null && result.getProperty(0).toString().equals("1")) {
            return "LOGIN_SUCCESS";// for a student
        }

PS Mi DB es Oracle y servicio web es el jabón y se utiliza bin axis2-1.2 y probado en Android 4.0 el código de respuesta de error anterior fue de 500 Error interno

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top