uscita kSOAP2 / org.xmlpull.v1.xmlpullparserexception START_TAG previsto
-
10-10-2019 - |
Domanda
Ho un codice standard per chiamare un .net webservice
ho exception "org.xmlpull.v1.xmlpullparserexception expected start_tag"
in linea
transportSE.call(SOAP_ACTION,soapSerializationEnvelope);
Tuttavia, se chiamo stesso webservice da un .NET code
ho un corretto output strutturato come desiderato.
Sembra in primo luogo che dal kSOAP2
, v'è un'uscita definitiva che si ottiene, ma quando si va a analizzare ulteriormente w.r.t oggetti SoapPrimitive, fallisce.
Quindi, c'è altro modo per cerca nella uscita effettiva (busta sapone effettivo) ricevuto e quindi può essere parse io appropriato.
Soluzione
Bene, ora che ho risolto il mio problema originale ha colpito questo!
ho scoperto che ksoap2 non poteva analizzare la risposta ... specificamente org.kxml2.io.KXmlParser.require (tipo, namespace, nome) ha gettato la seguente eccezione.
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)
Si noti che tag h1. Che viene da <h1>404 Not Found</h1>
... quindi sì, essere consapevoli tua risposta può essere da un sito web, ma non il servizio web:)
La speranza che aiuta qualcuno uno giorno
Altri suggerimenti
Sto indagando su un problema simile che sto avendo. Ci siamo imbattuti in questo commento
Quando uso SoapEnvelope.VER11, funziona benissimo, ma quando uso SoapEnvelope.VER12, mi dà errore: "Org.xmlpull.v1.XmlPullParserException: atteso: START_TAG".
http://groups.google.com/group/android- sviluppatori / browse_thread / filetto / b585862b6e939fd2
Forse stiamo avendo problemi di compatibilità per quanto riguarda la versione sapone. Anche per il collegamento di un punto di servizio di rete, potrebbe essere necessario envelope.dotNet = true;
insieme .. ma probabilmente avete fatto che
mi è stato sempre questo START_TAG eccezione, ma nel mio caso è stato perché i miei valori per
METHOD_NAME="";
NAMESPACE ="";
SOAP_ACTION ="";
URL ="";
non erano corrette.
Ora Come trovare i valori corretti di questi parametri è possibile verificare i miei altri risposta qui
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);
ho avuto quasi lo stesso errore, la mia eccezione è stata questa "posizione: START_TAG @ 2: 7"
, ma ho messo a posto perché ero di denominazione in un modo sbagliato di un parametro, il nome deve essere esattamente come è specificato nella XSD.
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("arg0_java_lang_String", "Club");
nella addPropery Metodo Io sto usando un nome di parametro sbagliato.
Dopo essersi assicurati l'url del webservice è raggiungibile utilizzando il codice qui sotto per guardare variabile urlc.getResponseCode()
per il codice di risposta, mentre alterando la IP dal localhost, fisso, esterna ed infine 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;
}
}
Per quanto mi riguarda ho ottenuto questo suggerimento "non il personaggio mancante s nel seguito"
[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
Il resto del registro 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)
E sì dopo aver tracciato il LogCat non ho controllato esimo server Tomcat log vigilia se il servizio è stato testato da SoapUI con successo, è necessario monitorare tutti i log di ogni prova il cambiamento, ho anche dimenticato in un primo momento per avviare il servizio di database in modo da stare attenti:)
Il sapone Chiama
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 La mia DB Oracle e webservice è sapone e utilizzato axis2-1.2 bin e testato su Android 4.0 il codice di risposta di errore precedente era di 500 Errore interno