我查看了幾個不同的問題/答案,這裏有關於Android中使用KSOAP2的XmlPullParserException的問題,但迄今爲止沒有任何東西能幫助我找出問題所在。我開始將我的iOS應用程序移植到Android上,現在我被困在讓應用程序與.Net Web服務進行通信的這一部分。以下是有問題的代碼,其中大部分代碼是由各種不同的問題/博客/網站拼湊而成的,因爲我在Web Service上也有一個自簽名證書。如果任何人有任何提示或可以指向我的一些閱讀的方向,這將幫助我弄清楚這將是很好的,因爲應用程序還有其他幾個領域使用Web服務,我知道我將需要知道如何比我現在得到的更好地進行調試。Android和HTTPS Web服務(XmlPullParserException)
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 erro的一部分。我想我會手動生成SOAP請求,我將在今晚晚些時候嘗試,看看是否有效。
發佈完整堆棧跟蹤。 'allowAllSSL()'聽起來很可疑,它有什麼作用?郵政編碼。一般來說,如果你有一個自簽名證書,你應該設置應用程序來信任它,允許_any_證書是一個_bad idea_。 –