使用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身份验证部分),这会阻止使用上述代码中使用的解决方法用于身份验证。
答案 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" />