KSOAP2を使用したAndroidのXmlPullParserExceptionに関するSOのいくつかの異なる質問/回答を見てきましたが、これまでのところ、何が問題なのかを理解するのに何の助けにもなりませんでした。私は自分の 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 リクエストを手動でビルドすることになると思います。それが機能するかどうかは、今夜遅くに試してみます。