无法从android:ksoap2-android访问基本身份验证的wsdl资源

时间:2011-08-21 10:30:21

标签: android wsdl http-authentication android-ksoap2

使用android的基本身份验证访问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中看到的那样“autorization”标题已经在这里:[user-agent,kSOAP / 2.0,content-type,text / xml,connection,close,content-length,330 ,授权,基本V1M6] 但是在resHeader中我得到了“需要HTTP / 1.1 401授权”。

当我尝试在浏览器中打开URL时 - 它工作正常,但它使用相同的“授权:基本V1M6”标题的GET方法。

有人可以解释我的代码在哪里错了吗?

提前谢谢!

更新即可。我发现它为什么会发生。 ksoap2 transport以小写字母给出(通过HttpURLConnection类)服务器http头,但是服务器(有时)期望它们每个都有大写字母。我无法理解(在源代码中找不到)HttpURLConnection使其变小的原因和位置。

更新2 。经过我的调查,我可以断言这个问题与版本2.2上的核心Android库(并且可能更旧)有关,但与ksoap2-android本身无关。 Android 2.3没有此问题 - 它在需要的情况下发送标头,并且Authenticator class也有效(请参阅Android开发者的HttpURLConnection的HTTP身份验证部分),这会阻止使用上述代码中使用的解决方法用于身份验证。

4 个答案:

答案 0 :(得分:0)

经过我的调查,我可以断言这个问题与版本2.2的核心Android库有关(可能更旧)但不是ksoap2-android本身。 Android 2.3没有此问题 - 它在需要的情况下发送标头,并且Authenticator class也有效(请参阅Android开发者的HttpURLConnection的HTTP身份验证部分),这会阻止使用上述代码中使用的解决方法用于身份验证。

答案 1 :(得分:0)

你有一个XmlPullParserException,因为你可能正在使用早期版本,请切换ksoap的2.5.7版本,不会出现这种异常。

答案 2 :(得分:0)

我在ksoap2 coding tips&tricks找到了这个。 它说你应该使用“使用extras包中的类HttpTransportBasicAuth”。

答案 3 :(得分:-1)

我将api版本8改为10,解决了这个问题。

的AndroidManifest.xml:

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