我需要使用Android来使用SOAP Web服务。
问题是在请求特定功能之前,我需要使用基本的http请求来验证客户端。
你知道如何使用KSOAP做到这一点吗?
直到这一刻我尝试使用httpsTransportSE.call()的重载方法,因为它建议我可以为http连接指定其他标头
headerPropertyList.add(new HeaderProperty("Authorization", "Basic : dXNlcjpwYXNz"));
“cdXNlcjpwYXNz”是64位编码的“user:pass”字符串
public List call(String soapAction, SoapEnvelope envelope, List headers)
* @param headers a list of HeaderProperties to be http header properties when establishing the connection
private static final String SOAP_ACTION = "someaddress/IPortReporting/GetPortStatus";
private static final String METHOD_NAME = "methodname";
private static final String NAMESPACE = "http://ssn.someaddress/2.0/";
private static final String URL = "new.someaddress/functionName.svc";
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
Request.addProperty("MessageId", "1");
SoapSerializationEnvelope soapEnvelop = new SoapSerializationEnvelope(
11);
//soapEnvelop.headerOut = addHeaders();
soapEnvelop.dotNet = true;
soapEnvelop.setOutputSoapObject(Request);
List<HeaderProperty> headerPropertieList = new ArrayList<HeaderProperty>();
headerPropertyList.add(new HeaderProperty("Authorization", "Basic : cG9ydHdzOjEyM3F3ZUFTRA=="));
//HeaderProperty headerProperty = new HeaderProperty()
HttpsTransportSE httpsse = new HttpsTransportSE(URL, 443, "", 5000);
try {
httpsse.call(SOAP_ACTION, soapEnvelop, headerPropertyList);
//httpsse.call(SOAP_ACTION, soapEnvelop);
SoapPrimitive resultString = (SoapPrimitive) soapEnvelop
.getResponse();
tv.setText("Status: ");
} catch (Exception e) {
tv.setText("Some error," + " "
+ e.getMessage());
}
但是我收到了“被拒绝的许可”的消息。
答案 0 :(得分:10)
试试这个。这对我有用,从android应用程序中消耗.Net服务。我使用过ksoap2-android-assembly-2.5.8-jar-with-dependencies.jar
String NAMESPACE = "http://www.namespace.com/";
String METHOD_NAME = "MethodName";
String SOAP_ACTION = "http://www.namespace.com/MethodName";
String URL = "https://www.namespace.com/services/Service.asmx";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
// Set all input params
request.addProperty("property", "value");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
// Enable the below property if consuming .Net service
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
try
{
List<HeaderProperty> headerList = new ArrayList<HeaderProperty>();
headerList.add(new HeaderProperty("Authorization", "Basic " + org.kobjects.base64.Base64.encode("username:password".getBytes())));
androidHttpTransport.call(SOAP_ACTION, envelope, headerList);
SoapObject response = (SoapObject)envelope.getResponse();
//response.getProperty(0).toString();
}
catch(Exception e)
{
e.printStackTrace();
}
答案 1 :(得分:4)
在这个问题的链接问题中,HeaderProperty的第二个arg中没有冒号 - 它将是“Basic dXNlcjpwYXNz” - 也许这就是问题所在? (哪一个是正确的?)
答案 2 :(得分:2)
您可能需要在Android清单文件中包含以下内容:
<uses-permission android:name="android.permission.INTERNET" />
答案 3 :(得分:2)
答案 4 :(得分:1)
您是否尝试过HttpTranspostBasicAuth?
以下是参考信息: http://ksoap2.sourceforge.net/doc/api/org/ksoap2/transport/HttpTransportBasicAuth.html
答案 5 :(得分:0)
仅限本作品 https://stackoverflow.com/a/5614243/7198554 ....
soapEnvelope.headerOut = new Element[1];
这 - &gt; SoapSerializationEnvelope envelope
NAMESPACE这个 - &gt; http://tempuri.org/
我的代码=&gt;
public Element buildAuthHeader() {
Element h = new Element().createElement(NAMESPACE, "AuthHeader");
Element username = new Element().createElement(NAMESPACE, "Username");
username.addChild(Node.TEXT, "test");
h.addChild(Node.ELEMENT, username);
// Element pass = new Element().createElement(NAMESPACE, "pass");
// pass.addChild(Node.TEXT, pass);
// h.addChild(Node.ELEMENT, pass);
return h;
在VS C#中
public class AuthHeader : SoapHeader
{
public string Username;
//public string Password;
}