2011-08-21 3 views
1

android에서 기본 인증을 사용하여 WSDL 리소스에 액세스 할 때 문제가 있습니다.android에서 기본 인증을 사용하여 wsdl 리소스에 액세스 할 수 없습니다. ksoap2-android

코드 : androidHTTPTransport.call에

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.connection.connection.reqHeader.props "autorization"헤더는 이미 여기에 있습니다 : [user-agent, kSOAP/2.0, content-type, text/xml, connection, close, content-length, 330 , authorization, Basic V1M6] 하지만 resHeader에서 "HTTP/1.1 401 인증 필요"가 표시됩니다.

브라우저에서 URL을 열려고하면 제대로 작동하지만 동일한 "Authorization : Basic V1M6"헤더가있는 GET 메서드를 사용합니다.

누구든지 내 코드에서 어디서 잘못 설명 할 수 있습니까?

미리 감사드립니다.

업데이트. 나는 그것이 왜 일어 났는지 발견했다. ksoap2 전송은 HttpURLConnection 클래스를 통해 서버 http 헤더를 작은 글자로 제공하지만, 서버 (때로는)는 각각 초기 글자가있는 것으로 기대합니다. 그리고 나는 HttpURLConnection이 왜 그렇게 작게 만들지 이해할 수 없다 (소스 코드에서 찾을 수 없다).

업데이트 2. 조사한 후에는이 문제가 핵심 Android 용 libs 버전 2.2 (및 이전 버전 일 수 있음)에 대한 우려가 있지만 ksoap2-android 자체에는 해당되지 않는다고 주장 할 수 있습니다. Android 2.3에는이 문제가 없습니다. 필요한 경우 헤더를 보내고 인증을 위해 위의 코드에서 사용 된 것과 같은 회피 방법을 사용하지 못하게하는 Authenticator class (Android 개발자의 HttpURLConnection의 HTTP 인증 섹션 참조)도 있습니다.

답변

0

조사한 결과이 문제는 핵심 Android 안드로이드 버전 2.2 (및 이전 버전 일 수도 있지만) 자체가 아니라 ksoap2-android 자체와 관련이 있다고 주장 할 수 있습니다. Android 2.3에는이 문제가 없습니다. 필요한 경우 헤더를 보내고 인증을 위해 위의 코드에서 사용 된 것과 같은 회피 방법을 사용하지 못하게하는 Authenticator class (Android 개발자의 HttpURLConnection의 HTTP 인증 섹션 참조)도 있습니다.

0

이전 버전을 사용하고있을 수 있으므로 XmlPullParserException이 발생했습니다. ksoap의 2.5.7 버전을 전환하십시오. 이런 종류의 예외는 발생하지 않습니다.

0

이 내용은 ksoap2 coding tips&tricks에 있습니다. "추가 패키지에서 HttpTransportBasicAuth 클래스 사용"을 사용해야한다고 나와 있습니다.

-1

API 버전 8을 10으로 변경하여이 문제를 해결했습니다.

의 AndroidManifest.xml :

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