推荐使用方式一,不用生成客户端代码
方式一:使用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); } }