6

我需要使用 Android 使用 SOAP Web 服务。

问题是,在请求特定功能之前,我需要使用基本的 http 请求对客户端进行身份验证。

你知道如何使用 KSOAP 做到这一点吗?

直到此刻,我已经尝试使用 httpsTransportSE.call() 的重载方法,因为它表明我可以为 http 连接指定其他标头

(参考: https ://github.com/mosabua/ksoap2-android/blob/master/ksoap2-j2se/src/main/java/org/ksoap2/transport/HttpTransportSE.java )

headerPropertyList.add(new HeaderProperty("Authorization", "Basic : dXNlcjpwYXNz"));

“cdXNlcjpwYXNz”是“user:pass”的base 64编码字符串

 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());
        }

但我有消息“权限被拒绝”报告回来。

4

6 回答 6

12

尝试这个。这对我有用,从 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();
}
于 2011-09-27T22:29:59.873 回答
4

在与此问题相关的问题中,HeaderProperty 的第二个参数中没有冒号 - 它将是“Basic dXNlcjpwYXNz” - 也许这就是问题所在?(哪一个是正确的?)

于 2011-06-01T18:00:24.470 回答
2

您很可能需要在 Android 清单文件中包含以下内容:

<uses-permission android:name="android.permission.INTERNET" />
于 2011-03-20T17:06:11.437 回答
2

看到这个。我已经实现了一个从 Android 应用程序调用本地 SOAP Web 服务(.asmx)的简单代码。

这是一个使用用户名和密码来验证用户身份的简单 Web 服务。

希望有帮助

干杯

于 2011-11-24T04:15:41.870 回答
1

您是否尝试过 HttpTranspostBasicAuth?

这里是参考信息: http: //ksoap2.sourceforge.net/doc/api/org/ksoap2/transport/HttpTransportBasicAuth.html

于 2011-07-13T18:26:50.950 回答
0

仅此工作 https://stackoverflow.com/a/5614243/7198554 ....

soapEnvelope.headerOut = new Element[1];

这个 ->SoapSerializationEnvelope envelope 命名空间这个 -> http://tempuri.org/ 我的代码=>

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;
}
于 2016-11-23T07:22:43.507 回答