我有一個問題,當從Android的基本身份驗證訪問WSDL資源。無法訪問wsdl資源與Android的基本身份驗證:ksoap2-android
代碼:
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「自動化」標題已經在這裏:[用戶代理,KSOAP/2.0,內容類型,文本/ XML,連接,關閉,內容長度,330 ,授權,基本V1M6] 但在resHeader我得到了「HTTP/1.1 401授權要求」。
當我試圖在瀏覽器中打開URL - 它工作得很好,但它使用GET方法一樣,「授權:基本V1M6」頭。
任何人都可以解釋我的代碼中錯了嗎?
預先感謝您!
UPDATE。我發現它爲什麼發生。 ksoap2傳輸通過小寫字母給(通過HttpURLConnection類)服務器http頭,但服務器(有時)期望每個大寫首字母。我無法理解(無法在源代碼中找到)HttpURLConnection爲什麼以及在哪裏使它變小。
UPDATE 2。經過我的調查,我可以斷言這個問題涉及2.2版核心Android庫(可能更老),但不涉及ksoap2-android本身。 Android 2.3的沒有這個問題 - 它在需要的情況下發送頭,並且也有Authenticator class工作過(見Android開發者的HttpURLConnection HTTP認證部分)使用變通方法,如在上述用於身份驗證的代碼中使用能防止。