Базовая HTTP-аутентификация с использованием KSOAP для Android - PullRequest
6 голосов
/ 03 марта 2011

Мне нужно использовать веб-сервис SOAP с помощью Android.

Проблема заключается в том, что перед запросом определенной функции мне нужно аутентифицировать клиента с помощью базового http-запроса.

Знаете ли выкак это сделать с помощью KSOAP?

До этого момента я пытался использовать перегруженный метод httpsTransportSE.call (), поскольку он предполагает, что я могу указать дополнительные заголовки для http-соединения

(ref: 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" - строка в кодировке base 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 ]

10 голосов
/ 28 сентября 2011

Попробуй это.Это сработало для меня, потребляя сервис .Net из приложения Android.Я использовал 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();
     }
4 голосов
/ 01 июня 2011

При связанном с этим вопросе у второго аргумента свойства HeaderProperty нет двоеточия - это будет "Basic dXNlcjpwYXNz" - может быть, в этом проблема? (Какой из них правильный?)

2 голосов
/ 24 ноября 2011

См. это .Я реализовал простой код, который вызывает локальный веб-сервис SOAP (.asmx) из приложения Android.

Это простой веб-сервис для аутентификации пользователя с использованием имени пользователя и пароля.

Надеюсь, что это поможет

Приветствия

2 голосов
/ 20 марта 2011

Скорее всего, вам нужно включить в файл манифеста Android следующее:

<uses-permission android:name="android.permission.INTERNET" />
1 голос
/ 13 июля 2011

Вы пробовали HttpTranspostBasicAuth?

Вот справочная информация: http://ksoap2.sourceforge.net/doc/api/org/ksoap2/transport/HttpTransportBasicAuth.html

0 голосов
/ 23 ноября 2016

ЭТО РАБОТАЕТ только 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;

In VS C #

public class AuthHeader : SoapHeader
{
public string Username;
//public string Password;
}
...