Question

J'ai un code standard pour appeler un .net webservice

Je reçois exception "org.xmlpull.v1.xmlpullparserexception expected start_tag" à la ligne

transportSE.call(SOAP_ACTION,soapSerializationEnvelope);

Cependant, si je l'appelle même d'un webservice .NET code je reçois une bonne sortie bien structuré comme on le souhaite.

Il semble surtout que de kSOAP2, il y a une sortie précise qu'il obtient, mais quand il va analyser plus w.r.t objets SoapPrimitive, il échoue.

Alors, est-il autre façon de regarder la sortie réelle (enveloppe de savon réelle) reçue et peut être Parse moi-même de façon appropriée.

Était-ce utile?

La solution

Eh bien maintenant que je l'ai résolu mon problème d'origine a frappé celui-ci!

Je trouve que ksoap2 n'a pas pu analyser la réponse ... spécifiquement org.kxml2.io.KXmlParser.require (type, espace de noms, le nom) a lancé l'exception suivante.

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) 

Notez que balise h1. Cela vient de <h1>404 Not Found</h1> ... donc oui, il faut savoir votre réponse peut provenir d'un site Web, mais pas votre service Web:)

L'espoir qui aide un jour quelqu'un

Autres conseils

J'enquête sur un problème similaire, je vais avoir. Nous sommes tombés sur ce commentaire

  

Quand j'utilise SoapEnvelope.VER11, il fonctionne très bien, mais quand je l'utilise   SoapEnvelope.VER12, il me donne l'erreur:   "Org.xmlpull.v1.XmlPullParserException: attendu: START_TAG".

http://groups.google.com/group/android- développeurs / browse_thread / fil / b585862b6e939fd2

Peut-être que nous avons des problèmes de compatibilité en ce qui concerne la version de savon. En outre la connexion à un point de service net, vous devrez peut-être ensemble envelope.dotNet = true; .. mais vous avez probablement fait que

Je recevais cette exception de START_TAG mais dans mon cas, ce fut parce que mes valeurs pour

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

ne sont pas correctes.

Comment trouver les valeurs correctes de ces paramètres, vous pouvez Vérifiez mon autre réponse

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);

J'ai eu presque la même erreur, mon exception était cette "position: START_TAG @ 2: 7"

mais je l'ai résolu parce que je nommerai dans une mauvaise façon un paramètre, le nom doit être exactement comme est spécifié sur le XSD.

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

dans la méthode addPropery Je travaillais avec un nom de paramètre erroné.

Après s'être assuré que l'url de webservice est accessible en utilisant le dessous du code par la variable regarder urlc.getResponseCode() pour le code de réponse tout en modifiant l'adresse IP de localhost, fixe, externe et enfin à 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;
        }

    }

Pour moi, j'ai eu ce soupçon "pas le caractère manquant s dans le bas"

[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

Le reste du journal 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)

Et oui après avoir retracé l'LogCat i n'a pas vérifié e tomcat veille journal si le service a été testé par SoapUI avec succès, vous devez surveiller tous les journaux dans tous les tests de changement, j'ai même oublié d'abord démarrer le service de base de données pour Attention:)

L'appel Soap

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 Mon Db Oracle et webservice est et du savon utilisé bin axis2-1.2 et testé sur Android 4.0 le code de réponse d'erreur ci-dessus était 500 erreur interne

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top