【JAVA】 CXF 动态请求wsdl接口

原文:https://blog.csdn.net/weixin_41884770/article/details/124032794

 

在cxf动态请求时,有需要BASIC 用户密码登录的情况,需要使用BUS来对用户名和密码进行处理,如果不需要进行BASIC认证,则去掉BUS部分即可.

import com.alibaba.fastjson.JSON;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.configuration.security.AuthorizationPolicy;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduitConfigurer;
import org.apache.cxf.transport.http.auth.DefaultBasicAuthSupplier;
import org.apache.cxf.transport.http.auth.HttpAuthSupplier;

/**
 * 请求wsdl 地址 并获取返回参数
 * @param userName  用户名
 * @param password 密码
 * @param wsdlUrl 请求路径
 * @param requestMethods    请求方法
 * @param port  如果需要区分http 请求和 https请求 则需要提供这个参数
 * @param data  请求数据
 * @return 返回数据
 */
public static String requestWsdlInterface(String userName, String password,String wsdlUrl,String requestMethods,QName port,Object data) {
    Bus bus = BusFactory.getThreadDefaultBus();
    bus.setExtension((name, address, httpConduit) -> {
        final AuthorizationPolicy authorization = new AuthorizationPolicy();
        authorization.setUserName(userName);
        authorization.setPassword(password);
        httpConduit.setAuthorization(authorization);
        final HttpAuthSupplier supplier = new DefaultBasicAuthSupplier();
        httpConduit.setAuthSupplier(supplier);
    }, HTTPConduitConfigurer.class);
    JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(bus);
    Client client = null;
    if(port!=null){
        client = factory.createClient( wsdlUrl, null,port);
    }else{
        client = factory.createClient(wsdlUrl);
    }
    String response = "";
    try {
        //得到对象所封装的值
        Object objects = client.invoke(requestMethods, data);
        response = JSON.toJSONString(objects);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return response;
}

 

posted @ 2022-08-11 09:37  独孤无绝  阅读(593)  评论(0编辑  收藏  举报