2011-08-21 33 views
1

我有一個問題,當從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認證部分)使用變通方法,如在上述用於身份驗證的代碼中使用能防止。

回答

0

我的調查後,我可以斷言,這個問題關注的2.2版本Android核心庫(和,可能是舊的),但不ksoap2,機器人本身。 Android 2.3沒有這個問題 - 它在需要的情況下發送頭文件,並且還有Authenticator class工作(請參閱Android開發人員的HttpURLConnection的HTTP身份驗證部分),這樣可以防止使用上述代碼中用於身份驗證的解決方法。

0

你有一個XmlPullParserException因爲可使用的是早期版本,請切換KSOAP的2.5.7版本,並不會得到這樣的異常。

-1

我把api版本8更改爲10,解決了這個問題。

的AndroidManifest.xml:

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