2011-03-03 12 views
5

Devo utilizzare un servizio Web SOAP utilizzando Android.Autenticazione HTTP di base tramite KSOAP per Android

Il problema è che prima di una richiesta per una particolare funzione ho bisogno di autenticare un client utilizzando la richiesta HTTP di base.

Sai come farlo usando KSOAP?

Fino a questo momento ho provato ad utilizzare metodo di overload di httpsTransportSE.call(), in quanto suggeriscono che posso specificare intestazioni aggiuntive per la connessione 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" è una stringa codificata 64 di "utente: 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()); 
     } 

Ma ho il messaggio "permesso negato" riportato indietro.

+0

quando si crea un'istanza di headerPropertyList si scrive proprietà, ma più tardi, quando lo si imposta, si chiama propertie che potrebbe essere? – GriffiN

risposta

2

È più probabile che sia necessario includere quanto segue nel tuo Android file manifesto:

<uses-permission android:name="android.permission.INTERNET" /> 
+1

Neem

4

Alla domanda legata a questo, il secondo arg della HeaderProperty non ha i due punti in esso - sarebbe "Basic dXNlcjpwYXNz" - forse questo è il problema? (Quale è corretto?)

+0

L'ho confermato - sicuramente nessun colon dovrebbe essere nella stringa" Basic ... " – Conrad

10

Prova questa. Questo ha funzionato per me, consumando il servizio. Net dall'applicazione Android. Ho usato ksoap2-android-assemblaggio-2.5.8-jar-con-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(); 
    } 
+0

come aggiungere nome utente e password nell'esempio sopra –

+0

ottiene input non valido: contenuto misto –

2

Vedi this. Ho implementato un codice semplice che chiama un servizio Web SOAP locale (.asmx) dall'applicazione Android.

È un semplice servizio Web per autenticare l'utente tramite nome utente e password.

Speranza che aiuta

Acclamazioni

0

QUESTO LAVORO solohttps://stackoverflow.com/a/5614243/7198554 ....

soapEnvelope.headerOut = new Element[1]; 

questo ->SoapSerializationEnvelope envelope NAMESPACE questo ->http://tempuri.org/ mio codice =>

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; 
} 
Problemi correlati