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 인증 섹션 참조)도 있습니다.