2013-01-07 7 views
6

Chcę utworzyć kopertę mydła z nagłówkiem bezpieczeństwa w Androidzie za pomocą ksoap2. Mój kod Androida to ...utworzyć kopertę mydła z nagłówkiem bezpieczeństwa w Androidzie za pomocą ksoap2

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.SoapFault; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransportSE; 
import org.kxml2.kdom.Element; 
import org.kxml2.kdom.Node; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
public class SOP_WebService extends Activity 
{ 

    private final String NAMESPACE = "http://xmlns.oracle.com/WorklistRetrival"; 
    private final String URL = "http://www.sample.com/orabpel/default/WorklistRetrival/1.0"; 
    private final String SOAP_ACTION = "process"; 
    private final String METHOD_NAME = "WorklistRetrievalREQ"; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.soap_webservice); 

     Button btnClick = (Button) findViewById(R.id.btnClick); 
     btnClick.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       callWebservice(); 
      } 
     }); 
    } 

    public void callWebservice() 
    { 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     PropertyInfo pi = new PropertyInfo(); 
     pi.setNamespace(NAMESPACE); 
     pi.setName("WorklistType"); 
     pi.setValue("PO_REQUISITION"); 
     request.addProperty(pi); 

     PropertyInfo p2 = new PropertyInfo(); 
     p2.setNamespace(NAMESPACE); 
     p2.setName("Status"); 
     p2.setValue("TODO"); 
     request.addProperty(p2); 

     PropertyInfo p3 = new PropertyInfo(); 
     p3.setNamespace(NAMESPACE); 
     p3.setName("Mode"); 
     p3.setValue(""); 
     request.addProperty(p3); 


     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     Log.i("bodyout", "" + envelope.bodyOut.toString()); 

     try 
     { 
      androidHttpTransport.debug = true; 
      androidHttpTransport.call(SOAP_ACTION, envelope); 
      SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
      Log.i("myApp", response.toString()); 
      Log.i("request", "" + envelope.bodyIn); 
      Log.i("response", "" + envelope.bodyOut); 
      Log.i("request", "" + androidHttpTransport.requestDump); 
      Log.i("response", "" + androidHttpTransport.responseDump); 
     } 
     catch (SoapFault e) 
     { 
      Log.d("soapFault", "soapFault"); 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      Log.d("Exception", "Exception"); 
      e.printStackTrace(); 
      Log.d("Exception Generated", ""+e.getMessage()); 
     } 

    } 

} 

A powyżej kodu utwórz poniżej żądania mydła bez nagłówka bezpieczeństwa.

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <soap:Header> 
    </soap:Header> 
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/bpel/aubi/mobile/Worklist"> 
     <ns1:WorklistRetrievalREQ> 
      <ns1:WorklistType>HR_OFFER</ns1:WorklistType> 
      <ns1:Status>TODO</ns1:Status> 
      <ns1:Mode/> 
     </ns1:WorklistRetrievalREQ> 
    </soap:Body> 
</soap:Envelope> 

Ale muszę utworzyć poniżej żądanie mydło z nagłówka bezpieczeństwa

<soap:Envelope 
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 

    <soap:Header> 
     <wsse:Security 
      xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
      xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
      xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" soap:mustUnderstand="1"> 
       <wsse:UsernameToken 
        xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
        xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
          <wsse:Username>cbrown</wsse:Username> 
          <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">welcome</wsse:Password></wsse:UsernameToken> 
     </wsse:Security> 
    </soap:Header> 
    <soap:Body xmlns:ns1="http://xmlns.oracle.com/bpel/aubi/mobile/Worklist"> 
     <ns1:WorklistRetrievalREQ> 
      <ns1:WorklistType>HR_OFFER</ns1:WorklistType> 
      <ns1:Status>TODO</ns1:Status> 
      <ns1:Mode/> 
     </ns1:WorklistRetrievalREQ> 
    </soap:Body> 
</soap:Envelope> 

Proszę mi powiedzieć, jakie zmiany są dokonywane w tym kodzie

Odpowiedz

10

znalazłem odpowiedź na moje pytanie. Jestem odpowiedzią na użyteczne dla innych.

public class SOAP_WebService extends Activity 
{ 

    private final String NAMESPACE = "http://ws.simple/"; 
    private final String URL = "http://10.0.2.2/SimpleWebservice/simple"; 
    private final String SOAP_ACTION = "http://ws.simple/getString"; 
    private final String METHOD_NAME = "getString"; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.soap_webservice); 

     Button btnClick = (Button) findViewById(R.id.btnClick); 
     btnClick.setOnClickListener(new OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       callWebservice(); 
      } 
     }); 
    } 
    public void callWebservice() 
    { 
     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
     PropertyInfo weightProp =new PropertyInfo(); 
     weightProp.name = "arg0"; 
     weightProp.setValue("rajan"); 
     request.addProperty(weightProp); 


     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 


     // create header 
     Element[] header = new Element[1]; 
     header[0] = new Element().createElement("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd","Security"); 
     header[0].setAttribute(null, "mustUnderstand","1"); 

     Element usernametoken = new Element().createElement("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken"); 
     usernametoken.setAttribute(null, "Id", "UsernameToken-1"); 
     header[0].addChild(Node.ELEMENT,usernametoken); 

     Element username = new Element().createElement(null, "n0:Username"); 
     username.addChild(Node.IGNORABLE_WHITESPACE,"CBROWN"); 
     usernametoken.addChild(Node.ELEMENT,username); 

     Element pass = new Element().createElement(null,"n0:Password"); 
     pass.setAttribute(null, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     pass.addChild(Node.TEXT, "welcome"); 

     usernametoken.addChild(Node.ELEMENT, pass); 


     // add header to envelope 
     envelope.headerOut = header; 


     Log.i("header", "" + envelope.headerOut.toString()); 


     envelope.dotNet = false; 
     envelope.bodyOut = request; 
     envelope.setOutputSoapObject(request); 
     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     Log.i("bodyout", "" + envelope.bodyOut.toString()); 

     try 
     { 
      androidHttpTransport.debug = true; 
      androidHttpTransport.call(SOAP_ACTION, envelope); 

      SoapPrimitive response = (SoapPrimitive)envelope.getResponse(); 
      Log.i("myApp", response.toString()); 
     } 
     catch (SoapFault e) 
     { 
      e.printStackTrace(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
      Log.d("Exception Generated", ""+e.getMessage()); 
     } 

    } 

} 
+0

Dzięki za akcję !!! – Mateus

+0

Dziękujemy za udostępnienie kodu. Twoje pierwotne wymaganie nie ma Id = UsernameToken-1, który jest w twoim ostatecznym kodzie. – Hong

+0

@kels: Byłbym bardzo wdzięczny, gdyby mógł Pan/i udostępnić pełny przykładowy kod źródłowy projektu SOAP, aby mógł go zbudować i zrozumieć. Czy gdzieś go hostowałeś? Próbowałem wielu opcji nadal nie ma sukcesu. – Raa

0

To działa dla mnie, aby dać nagłówka żądania zabezpieczeń w bibliotece kSOAP w Androidzie

public static Element buildAuthHeader() { 
     Element headers[] = new Element[1]; 
     headers[0]= new Element().createElement("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security"); 
     headers[0].setAttribute(null, "mustUnderstand", "1"); 
     Element security=headers[0]; 

     //user token 
     Element usernametoken = new Element().createElement(security.getNamespace(), "UsernameToken"); 
     usernametoken.setAttribute("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "Id", "UsernameToken-14CBAE357AC169AFA614664925178422"); 

     //username 
     Element username = new Element().createElement(security.getNamespace(), "Username"); 
     username.addChild(Node.TEXT, HttpConstant.REQ_HEADER_USERNAME); 
     usernametoken.addChild(Node.ELEMENT,username); 

     // password 
     Element password = new Element().createElement(security.getNamespace(), "Password"); 
     password.setAttribute(null, "Type", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"); 
     password.addChild(Node.TEXT, HttpConstant.REQ_HEADER_PASSWORD); 
     usernametoken.addChild(Node.ELEMENT,password); 


     headers[0].addChild(Node.ELEMENT, usernametoken); 

     return headers[0]; 
    } 



SoapSerializationEnvelope sSerialaEnvelop = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
     sSerialaEnvelop.dotNet = true; 
     sSerialaEnvelop.headerOut = new Element[1]; 
     sSerialaEnvelop.headerOut[0] = SoapBasicAuth.buildAuthHeader(); //// add security request header 
     sSerialaEnvelop.bodyOut = sObject; 
     sSerialaEnvelop.setOutputSoapObject(sObject); 
Powiązane problemy