关于使用KSOAP2的Android中的XmlPullParserException,我在这里看了几个不同的问题/答案,但到目前为止没有什么能帮助我弄清楚什么是错的。我开始将我的iOS应用程序移植到Android上,现在我仍然坚持让应用程序与.Net Web服务进行通信。以下是相关代码,其中大部分是从各种不同的问题/博客/网站拼凑而成,因为我在Web服务上也有自签名证书。如果有人有任何提示,或者可以指向一些阅读的方向,这将有助于我弄清楚这将是很好的,因为该应用程序的其他几个领域使用Web服务,我知道我将需要知道如何调试这比我现在得到的更好。
String URL = "https://online.ensinet.com/Services/ENSIMobileservice.asmx";
String SOAP_ACTION = "http://ensinet.com/VerifyRep";
String NAMESPACE = "http://ensinet.com/";
String METHOD_NAME = "VerifyRep";
String SERVER = "online.ensinet.com";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
//PropertyInfo usernamePI = new PropertyInfo();
//usernamePI.setName("RepLogin");
//usernamePI.setValue(username);
//usernamePI.setType(String.class);
request.addProperty("RepLogin", username);
//PropertyInfo passPI = new PropertyInfo();
//passPI.setName("RepPass");
//passPI.setValue(passphrase);
//passPI.setType(String.class);
request.addProperty("RepPass",passphrase);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
try
{
allowAllSSL();
HttpsTransportSE androidHttpTransport = new HttpsTransportSE(SERVER,443, URL, 1000);
androidHttpTransport.call(SOAP_ACTION,envelope);
SoapObject response=(SoapObject) envelope.getResponse();
Log.i("Message", "the response contains: " + response.toString());
}
catch(Exception e)
{
Log.i("Message", "there was an error: " + e);
}
好的,这里有更多信息。首先,allowAllSSL()是我在另一个论坛中找到的绕过自签名证书的凭证管理器的方法,因为我没有凭据,并且移动设备收集的信息不像Web应用程序那样敏感托管所有Web服务的位置。以下是详细设置伪凭证管理器的方法
private static TrustManager[] trustManagers;
public static class _FakeX509TrustManager implements
javax.net.ssl.X509TrustManager {
private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
public boolean isClientTrusted(X509Certificate[] chain) {
return (true);
}
public boolean isServerTrusted(X509Certificate[] chain) {
return (true);
}
public X509Certificate[] getAcceptedIssuers() {
return (_AcceptedIssuers);
}
}
public static void allowAllSSL() {
javax.net.ssl.HttpsURLConnection
.setDefaultHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
javax.net.ssl.SSLContext context = null;
if (trustManagers == null) {
trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
}
try {
context = javax.net.ssl.SSLContext.getInstance("SSL");
context.init(null, trustManagers, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
Log.e("allowAllSSL", e.toString());
} catch (KeyManagementException e) {
Log.e("allowAllSSL", e.toString());
}
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
.getSocketFactory());
}
}
另外,我看了一下requestDump,我注意到在请求中有一个<Header />
标签,它不是实际Web服务请求的一部分所以我认为这是由KSOAP2添加的,所以到目前为止,我还没有找到一种方法来移除它,这可能是我正在获得的START TAG错误的一部分。我想我将手动构建SOAP请求,我将在今晚稍后尝试查看是否有效。
答案 0 :(得分:0)
好的,所以我能够找出问题所在。看起来android端比iOS端更具体,因为问题是我正在使用的URL。在上面的代码中,我使用了iOS代码中可用于移动应用程序的完整操作列表的URL,但我需要使用我正在调用的操作的实际URL(所以我需要添加?op = VerifyRep到上面的URL字符串的末尾)。现在我得到了正确的答案,所以它将进入下一步并试图弄清楚如何解析所需的数据。