2011-03-03 31 views
5

Tôi cần sử dụng dịch vụ web SOAP bằng Android.Xác thực HTTP cơ bản bằng cách sử dụng KSOAP cho android

Vấn đề là trước khi yêu cầu một hàm cụ thể, tôi cần xác thực ứng dụng bằng cách sử dụng yêu cầu http cơ bản.

Bạn có biết cách thực hiện điều này bằng KSOAP không?

Cho đến thời điểm này tôi đã cố gắng sử dụng phương pháp quá tải của httpsTransportSE.call() vì nó gợi ý rằng tôi có thể xác định tiêu đề bổ sung cho kết nối 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" là chuỗi được mã hóa 64 của "người dùng: vượt qua"

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

Nhưng tôi có thông báo "quyền bị từ chối" được báo cáo lại.

+0

khi bạn nhanh chóng headerPropertyList bạn viết bất động sản, nhưng sau khi bạn cài đặt nó, bạn gọi nó propertie mà có thể được? – GriffiN

Trả lời

2

Bạn có lẽ hầu hết cần phải bao gồm những điều sau đây trong Android file manifest của bạn:

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

Neem

4

Với câu hỏi liên quan đến thế này, các arg thứ hai của HeaderProperty không có một dấu hai chấm trong nó - nó sẽ là "Basic dXNlcjpwYXNz" - có lẽ đó là vấn đề? (Cái nào đúng?)

+0

Tôi xác nhận điều đó - chắc chắn không có dấu hai chấm nào trong chuỗi" Cơ bản ... " – Conrad

10

Hãy thử điều này. Điều này làm việc cho tôi, tiêu thụ dịch vụ .Net từ ứng dụng Android. Tôi đã sử dụng 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(); 
    } 
+0

cách thêm tên người dùng và mật khẩu trong ví dụ trên –

+0

nhận thông tin nhập sai: Nội dung hỗn hợp –

2

Xem this. Tôi đã triển khai một mã đơn giản gọi một dịch vụ web SOAP cục bộ (.asmx) từ ứng dụng Android.

Đây là dịch vụ web đơn giản để xác thực người dùng bằng tên người dùng và mật khẩu.

Hy vọng rằng sẽ giúp

Cheers

0

LÀM VIỆC NÀY chỉhttps://stackoverflow.com/a/5614243/7198554 ....

soapEnvelope.headerOut = new Element[1]; 

này ->SoapSerializationEnvelope envelope không gian tên này ->http://tempuri.org/ mã của tôi =>

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; 

Trong VS C#

public class AuthHeader : SoapHeader 
{ 
public string Username; 
//public string Password; 
} 
Các vấn đề liên quan