1

我想使用 ksoap2 库在 android 中调用 wsdl 文件。我必须为肥皂信封中的标题提供安全性。我提出以下类型的肥皂请求,如下所示。

<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>

但我不知道如何在信封头()中提供安全性。所以,请帮助代码。

提前致谢...

4

2 回答 2

2

最后我得到了我的问题的答案。

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

    }

}
于 2013-02-10T16:55:43.723 回答
0

这对我有用...试试这个。

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];
    }
于 2017-01-09T09:28:28.213 回答