2013-10-14 15 views

回答

2

使用ws_security一個SOPA EWB服務我有同樣的問題。然而,這是可能的。正如您可能已經發現的那樣,使用Java甚至SoapUI設置調用非常容易,因爲所有的WS-Security都是內置的或者在庫中可用的。從PL/SQL執行此操作時,必須手動構建WS-Security標題。但是,如果您的端點需要用戶名令牌身份驗證,則這非常簡單。

這個例子是我用來建立SOAP信封使Web服務調用的WSO2 ESB端點的函數的代碼段。

FUNCTION getSoapRequest RETURN CLOB 
IS 
    lUserName VARCHAR2(100) := 'myuser'; 
    lPassword VARCHAR2(100) := 'mypassword'; 
    lSoapRequest CLOB; 
BEGIN 
    --Get your Created and Expiration Timestamps for the Token (In this case it is 3 minutes) 
    SELECT TO_CHAR(SYSDATE + (4/24), 'YYYY-MM-DD')||'T'||TO_CHAR(SYSDATE + (4/24), 'HH24:MI:SS')||'Z' 
      ,TO_CHAR(SYSDATE + (3/1440) + (4/24), 'YYYY-MM-DD')||'T'||TO_CHAR(SYSDATE + (3/1440) + (4/24), 'HH24:MI:SS')||'Z' 
    INTO lCreateTimestampString, 
      ,lExpireTimestampString 
    FROM dual; 

     lSoapRequest :='<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:Cisco_IncidentCreateWS_ext"> 
          <soapenv:Header> 
          <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
           <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Timestamp-14"> 
            <wsu:Created>'||lCreateTimestampString||'</wsu:Created> 
            <wsu:Expires>'||lExpireTimestampString||'</wsu:Expires> 
           </wsu:Timestamp> 
           <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-13"> 
           <wsse:Username>'||lUserName||'</wsse:Username> 
           <wsse:Password Type="wsse:PasswordText">'||lPassword||'</wsse:Password> 
           </wsse:UsernameToken> 
           </wsse:Security> 
          </soapenv:Header> 
          <soapenv:Body> 
          … 
          </soapenv:Body> 
         </soapenv:Envelope>'; 

    RETURN lSoapRequest; 
END getSoapRequest;