ksoap2 output / org.xmlpull.v1.xmlpullparserexception start_tagが期待されます
-
10-10-2019 - |
質問
呼び出す標準コードがあります .net webservice
私は得ます exception "org.xmlpull.v1.xmlpullparserexception expected start_tag"
ラインで
transportSE.call(SOAP_ACTION,soapSerializationEnvelope);
ただし、から同じウェブサービスを呼び出すと .NET code
必要に応じて、十分に構造化された適切な出力を取得します。
それは主にからです kSOAP2
, 、それが取得する明確な出力がありますが、それがさらにwrtソーアップリミティブオブジェクトを解析するとき、それは失敗します。
したがって、実際の出力(実際の石鹸エンベロープ)を見て、自分で適切に解析する他の方法があります。
解決
さて、私は元の問題を解決したので、これにヒットしました!
KSOAP2は応答を解析できないことがわかりました...具体的にはorg.kxml2.io.kxmlparser.require(type、namespace、name)は次の例外を投げました。
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)
H1タグに注意してください。それはから来ます <h1>404 Not Found</h1>
...そうです、あなたの応答はあなたのウェブサービスではなく、ウェブサイトからのものかもしれないことに注意してください:)
いつか誰かを助けることを願っています
他のヒント
私が抱えている同様の問題を調査しています。このコメントにつまずいた
soapenvelope.ver11を使用すると正常に動作しますが、soapenvelope.ver12を使用するとエラーが発生します。
http://groups.google.com/group/android-developers/browse_thread/thread/b585862b6e939fd2
おそらく、SOAPバージョンに関する互換性の問題があります。また、ドットネットサービスに接続する必要がある場合があります envelope.dotNet = true;
..しかし、あなたはおそらくそれをしたでしょう
私はこのstart_tagの例外を取得していましたが、私の場合、それは私の価値が
METHOD_NAME="";
NAMESPACE ="";
SOAP_ACTION ="";
URL ="";
正しくありませんでした。
ここで、これらのパラメーターの正しい値を見つける方法 ここで私の他の答えをチェックしてください
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);
私はほぼ同じエラーがありました、私の例外はこの「Position:start_tag @2:7」でした
しかし、私は間違った方法でパラメーターを命名していたので修正しました。名前はXSDで指定されているとおりである必要があります。
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("arg0_java_lang_String", "Club");
の中に アドプロパリー 方法私は間違ったパラメーター名を使用していました。
WebServiceのURLが確認した後 到達可能 変数を監視して以下のコードを使用します urlc.getResponseCode()
IPを変更しながら応答コードの場合 LocalHost、固定、外部、そして最終的に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;
}
}
私にとって私はこのヒントを得ました「行方不明のキャラクターではありません s 以下で」
[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
残りのログトムキャットなど
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)
そして、はい、ログキャットをトレースした後、サービスがテストされているかどうかをTomcat Server Log EVEチェックしませんでした ソープイ 成功して、すべての変更テストですべてのログを監視する必要があります。最初はデータベースサービスを開始することを忘れてしまったので、注意してください:)
石鹸の呼び出し
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
}
詩 私のDBはOracleであり、Webサービスは石鹸で使用されています axis2-1.2ビン Android 4.0でテストされた上記のエラー応答コードは500でした 内部エラー