使用KSOAP for android的基本HTTP身份验证

时间:2011-03-03 07:41:49

标签: android http basic-authentication ksoap

我需要使用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”是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());
        }

但是我收到了“被拒绝的许可”的消息。

6 个答案:

答案 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)

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

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

希望有所帮助

干杯

答案 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;
}