1

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 リクエストを手動でビルドすることになると思います。それが機能するかどうかは、今夜遅くに試してみます。

4

1 に答える 1

0

さて、私は問題を理解することができました。問題は私が使用していたURLだったので、Android側はiOS側よりも少し具体的であるようです。上記のコードでは、iOS コードと同様に、モバイル アプリケーションで使用できる操作の完全なリストの URL を使用していましたが、呼び出す操作の実際の URL を使用する必要がありました (そのため、?op を追加する必要がありました)。 =VerifyRep を上記の URL 文字列の末尾に追加します)。適切な応答が得られたので、次のステップに進み、必要なデータを解析する方法を見つけようとしています。

于 2012-10-11T05:37:36.853 に答える