1

Android から Basic 認証で WSDL リソースにアクセスする際に問題が発生します。

コード:

package ru.itgorod.test.wsdl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.ksoap2.HeaderProperty;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class WSDLTestActivity extends Activity {

    private static final String NAMESPACE = "http://www.example.ru/lecompre";
    private static final String URL="http://10.0.0.233/lecompre/ws/lecompre?wsdl"; 
    private static final String METHOD_NAME = "GetGoodsList";
    private static final String SOAP_ACTION =  "http://www.example.ru/lecompre/GetGoodsList";   

    private static final String USERNAME = "WS";
    private static final String PASSWORD = "";

    private TextView txt;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        txt = (TextView) findViewById(R.id.textView1);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        Log.i("wsdl", "1");

        androidHttpTransport.debug = true;

        StringBuffer auth = new StringBuffer(USERNAME);
        auth.append(':').append(PASSWORD);
        byte[] raw = auth.toString().getBytes();
        auth.setLength(0);
        auth.append("Basic ");
        org.kobjects.base64.Base64.encode(raw, 0, raw.length, auth);
        List<HeaderProperty> headers = new ArrayList<HeaderProperty>();
        headers.add(new HeaderProperty("Authorization", auth.toString())); // "Basic V1M6"));

        try {
            Log.i("wsdl", "2");
            Object response = androidHttpTransport.call(SOAP_ACTION, envelope, headers); // I got an XmlPullParserException here
            Log.i("wsdl", "3");
        } catch (IOException e) {
            txt.setText("IOException");
        } catch (XmlPullParserException e) {
            txt.setText("XmlPullParserException");
        }

        SoapObject result = null;
        try {
            Log.i("wsdl", "4"); 
            result = (SoapObject)envelope.getResponse(); 
            Log.i("wsdl", result.toString());
        } catch (SoapFault e) {
            txt.setText("SoapFault");
        }                    
    }
}

androidHTTPTransport.call() で例外が発生しました。サーバーは「アクセスが拒否されました」という回答を返します。しかし、デバッグ androidHTTPTransport.connection.connection.reqHeader.props でわかるように、「承認」ヘッダーは既にここにあります: [user-agent, kSOAP/2.0, content-type, text/xml, connection, close, content-length, 330 , 認可, Basic V1M6] しかし、resHeader で "HTTP/1.1 401 Authorization Required" を得ました。

ブラウザーで URL を開こうとすると、正常に動作しますが、同じ "Authorization: Basic V1M6" ヘッダーで GET メソッドを使用します。

コードのどこが間違っているか誰か説明できますか?

前もって感謝します!

更新します。なぜそれが起こったのかわかりました。ksoap2 トランスポートは (HttpURLConnection クラスを介して) サーバーの http ヘッダーに小文字で提供しますが、サーバーは (場合によっては) それぞれの頭文字が大文字であることを期待します。そして、なぜ、どこで HttpURLConnection がそれを小さくするのか理解できません (ソースコードで見つけることができません)。

更新 2。私の調査の結果、この問題はバージョン 2.2 (および、それよりも古い可能性があります) の Android ライブラリのコアに関係するものであり、ksoap2-android 自体には関係ないと断言できます。Android 2.3 にはこの問題はありません。必要な場合にヘッダーを送信し、Authenticator クラスも機能します (Android Developers のHttpURLConnectionの HTTP 認証セクションを参照)。これにより、上記のコードで認証に使用されているような回避策を使用できなくなります。

4

4 に答える 4

0

以前のバージョンを使用している可能性があるため、XmlPullParserException が発生しました。ksoap の 2.5.7 バージョンに切り替えてください。この種の例外は発生しません。

于 2011-09-08T12:31:33.077 に答える
0

これはksoap2 コーディングのヒントとコツで見つけました。「extras パッケージのクラス HttpTransportBasicAuth を使用する」必要があると書かれています。

于 2012-12-30T19:29:52.943 に答える
0

私の調査の結果、この問題はバージョン 2.2 のコア Android ライブラリ (および、それよりも古い可能性があります) に関係していると断言できますが、ksoap2-android 自体には関係ありません。Android 2.3 にはこの問題はありません。必要な場合にヘッダーを送信し、Authenticator クラスも機能します (Android Developers のHttpURLConnectionの HTTP 認証セクションを参照)。これにより、上記のコードで認証に使用されているような回避策を使用できなくなります。

于 2011-08-25T13:35:41.637 に答える
-1

API バージョン 8 を 10 に変更し、この問題を解決しました。

AndroidManifest.xml:

<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="10" />

于 2013-02-27T14:21:19.027 に答える