Android和HTTPS Web服务(XmlPullParserException)

时间:2012-10-09 16:39:59

标签: android web-services

关于使用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请求,我将在今晚稍后尝试查看是否有效。

1 个答案:

答案 0 :(得分:0)

好的,所以我能够找出问题所在。看起来android端比iOS端更具体,因为问题是我正在使用的URL。在上面的代码中,我使用了iOS代码中可用于移动应用程序的完整操作列表的URL,但我需要使用我正在调用的操作的实际URL(所以我需要添加?op = VerifyRep到上面的URL字符串的末尾)。现在我得到了正确的答案,所以它将进入下一步并试图弄清楚如何解析所需的数据。