Android和HTTPS Web服务(XmlPullParserException)
关于使用KSOAP2的Android中的XmlPullParserException,我在这里查看了几个不同的问题/答案,但到目前为止,没有任何东西能帮助我找出问题所在。我开始将我的iOS应用程序移植到Android上,而现在我正忙于让应用程序与.Net Web服务进行通信。下面是讨论中的代码,其中大部分是从各种不同的问题/博客/网站拼凑而成的,因为我在Web服务上也有一个自签名证书。如果有人有任何建议或可以告诉我一些阅读的方向,这将帮助我找出这一点,这将是伟大的,因为有几个应用程序的其他领域使用Web服务,我知道我需要知道如何调试这比我现在得到的更好Android和HTTPS Web服务(XmlPullParserException),android,web-services,Android,Web Services,关于使用KSOAP2的Android中的XmlPullParserException,我在这里查看了几个不同的问题/答案,但到目前为止,没有任何东西能帮助我找出问题所在。我开始将我的iOS应用程序移植到Android上,而现在我正忙于让应用程序与.Net 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,注意到在请求中有一个
标记,它不是实际Web服务请求的一部分,所以我认为这是由KSOAP2添加的,到目前为止,我还没有找到删除它的方法,这可能是我得到的开始标记erro的一部分。我想我将手动生成SOAP请求,今晚晚些时候我将尝试这样做,看看是否有效 好的,所以我能够解决这个问题。看起来android端比iOS端更具体,因为问题是我使用的URL。在上面的代码中,我使用了可用于移动应用程序的完整操作列表的URL,就像在iOS代码中一样,但我需要使用我调用的操作的实际URL(因此我需要在上面的URL字符串末尾添加?op=VerifyRep)。现在,我得到了正确的响应,因此现在进入下一步,并试图找出解析所需数据的方法 后满栈跟踪allowAllSSL()
听起来很可疑,它做了什么?邮政编码。通常,如果你有一个自签名证书,你应该将应用程序设置为信任它,允许任何证书都是一个坏主意。