webservice客户端连接方式

推荐使用方式一,不用生成客户端代码

方式一:使用HTTPConduit 调用方式

注意:dom4j要求root根节点只有一个,单节点使用client.invoke("process", xml),多节点使用client.invoke("process", xml,xml2);。
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
import org.apache.cxf.transport.http.HTTPConduit;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
private Object[] connectWS(String xml,String xml2,String url){
        JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
        System.out.println("wsUrl===="+url);
        Client client = factory.createClient(url);
        // 需要密码的情况需要加上用户名和密码
        //client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,PASS_WORD));
        HTTPConduit conduit = (HTTPConduit) client.getConduit();
        HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
        httpClientPolicy.setConnectionTimeout(2000);  //连接超时
        httpClientPolicy.setAllowChunking(false);    //取消块编码
        httpClientPolicy.setReceiveTimeout(120000);     //响应超时
        conduit.setClient(httpClientPolicy);
        Object[] objects = null;
        try {
            org.apache.cxf.jaxws.interceptors.WrapperClassOutInterceptor a = null;
            System.out.println("数据:--->>>" + xml);
           // 单节点,只传xml,xml可以document.asXML()
           // objects = client.invoke("process", xml);
           // 多节点,每个节点是一个参数,直接传节点内容,本次对接接口不能用document.asXML()。
            objects = client.invoke("process", xml,xml2);
            String result = objects.toString();
            System.out.println("返回数据:result---->>>" + result);
            System.out.println("返回数据:---->>>" + objects[0]);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  objects;
    }  

方式二:使用idea生成webservice客户端接口IIHService(wsimport生成客户端代码 )

(1)使用生成的IIHServiceService调用IIHService(proces为webservice接口方法名)

注意:此方法webservice的地址需写死在IIHServiceService 中,不利于部署和更改地址

IIHServiceService iihServiceService = new IIHServiceService();
IIHService iihService= iihServiceService.getIIHServicePort();
// iihService 调用接口
  String xml = "入参的xml格式";
  String result = iihService.process("XXX",xml);
  System.out.println(result);  

(2) 使用service编程调用IIHService(proces为webservice接口方法名)

package XX;  

import java.io.IOException;
import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

import XX.IIHService ;  

/** 
 *  Description:Service编程实现服务端调用
 *  这种方式同样需要wsimport生成客户端代码,只不过仅需要将服务接口类引入即可,例如如果需要 
 *  端口服务,则需要将生成的IIHService .class类引入
 */  
public class ServiceClient {  

    public static void main(String[] args) throws IOException {  
        //创建WSDL的URL,注意不是服务地址  
        URL url = new URL("http://IIII:PPPP/CC/IIHService?wsdl");  

        //创建服务名称  
        //1.namespaceURI - 命名空间地址 (wsdl文档中的targetNamespace)
        //2.localPart - 服务视图名  (wsdl文档中服务名称,例如<wsdl:service name="IIHServiceService">)
        QName qname = new QName("http://IIII/", "IIHServiceService");  

        //创建服务视图  
        //参数解释:  
        //1.wsdlDocumentLocation - wsdl地址  
        //2.serviceName - 服务名称  
        Service service = Service.create(url, qname);  
        //获取服务实现类 
        //参数解释:serviceEndpointInterface - 服务端口(wsdl文档中服务端口的name属性)
        IIHService iihService= service.getPort(IIHService.class);  
        //调用查询方法  
        String xml = "入参的xml格式";
        String result = iihService.process("XXX",xml);
        System.out.println(result);  
    }  
}     
原文地址:https://www.cnblogs.com/tong2018/p/14688887.html