簡體   English   中英

使用CXF的ExactTarget SOAP客戶端

[英]ExactTarget SOAP Client Using CXF

我正在尋找使用CXF構建獨立的ExactTarget SOAP客戶端。

我能夠使用Glassfish Metro創建一個客戶端,但是由於將來的支持考慮,我們希望使用CXF。 我找到了一個舊的示例和相關項目,但是它太舊了,無法使用。

當前,我試圖了解如何在存根/端口對象上設置處理程序並將動態用戶名和密碼傳遞給該對象。 動態是指:應用在運行時從用戶那里獲取用戶名和密碼。 這是我目前用於Metro實施的代碼:

PartnerAPI service = new PartnerAPI();
Soap stub = service.getSoap();      
Map<String, Object> outProperties = new HashMap<String, Object>();        
Map ctx = ((BindingProvider) stub).getRequestContext();

requestContext.put(BindingProvider.USERNAME_PROPERTY, user);
requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);

List<Handler> chain = new ArrayList<Handler>();
chain.add(new SecurityHandler());
((BindingProvider) stub).getBinding().setHandlerChain(chain);

我正在嘗試將前4-6行重用於CXF實現,但是我不能使用我擁有的處理程序,因為它們依賴於com.sun.xml.wss.XWSSProcessor

這是執行所有操作的代碼:

private static Soap createApiStub() {
    PartnerAPI service = new PartnerAPI();
    Soap stub = service.getSoap();          
    Client client = org.apache.cxf.frontend.ClientProxy.getClient(stub);     

    Map<String, Object> outProps = new HashMap<String, Object>();        
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    outProps.put(WSHandlerConstants.USER, username);     
    outProps.put(WSHandlerConstants.PASSWORD_TYPE,WSConstants.PW_TEXT);        
    // Automatically adds a Base64 encoded message nonce and a created timestamp
    outProps.put(WSHandlerConstants.ADD_UT_ELEMENTS,WSConstants.NONCE_LN + " " + WSConstants.CREATED_LN);    
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new ClientPasswordCallback(username, password));
    WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);
    client.getOutInterceptors().add(wssOut);

    //Enable GZip compression
    Map<String, java.util.List<String>> httpHeaders = new HashMap<String, java.util.List<String>>();
    httpHeaders.put("Content-Encoding",Collections.singletonList("gzip"));
    httpHeaders.put("Accept-Encoding",Collections.singletonList("gzip"));
    Map<String, Object> reqContext = client.getRequestContext();
    reqContext.put(MessageContext.HTTP_REQUEST_HEADERS,httpHeaders);

    return stub;
}

這是處理程序的實現:

public class ClientPasswordCallback implements CallbackHandler {

    private String username;
    private String password;

    public ClientPasswordCallback(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public void handle(Callback[] callbacks) throws IOException, 
    UnsupportedCallbackException {
        for (Callback callback: callbacks){
            if (callback instanceof WSPasswordCallback){
                WSPasswordCallback pc = (WSPasswordCallback) callback;              
                if (username.equals(pc.getIdentifier())) {                  
                    pc.setPassword(password);                   
                }
            } else if (callback instanceof NameCallback){
                throw new UnsupportedCallbackException(callback);
            } else {
                throw new UnsupportedCallbackException(callback);
            }           
        }
    }
}

這個答案幫助我動態地通過了密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM