java-webService(调用wsdl接口)

使用Axis或XFire实现WebService:

Axis2是Apache下的一个重量级WebService框架,准确说它是一个Web Services / SOAP / WSDL 的引擎,是WebService框架的集大成者,它能不但能制作和发布WebService,而且可以生成Java和其他语言版WebService客户端和服务端代码。这是它的优势所在。但是,这也不可避免的导致了Axis2的复杂性,使用过的开发者都知道,它所依赖的包数量和大小都是很惊人的,打包部署发布都比较麻烦,不能很好的与现有应用整合为一体。但是如果你要开发Java之外别的语言客户端,Axis2提供的丰富工具将是你不二的选择。
 
XFire是一个高性能的WebService框架,在Java6之前,它的知名度甚至超过了Apache的Axis2,XFire的优点是开发方便,与现有的Web整合很好,可以融为一体,并且开发也很方便。但是对Java之外的语言,没有提供相关的代码工具。XFire后来被Apache收购了,原因是它太优秀了,收购后,随着Java6 JWS的兴起,开源的WebService引擎已经不再被看好,渐渐的都败落了。

参考路径:

https://blog.csdn.net/rockstar541/article/details/21106407

axis2:

参考路径:

https://ldzyz007.iteye.com/blog/1065927

https://blog.csdn.net/qq_22067469/article/details/83652562

http://blog.sina.com.cn/s/blog_b18fc8d60102wwhm.html

private static Object[] requestFunctionWebService(String url,String parameters,String namespance,String methodName) {
        try {
            RPCServiceClient rpcServiceClient = new RPCServiceClient();
            EndpointReference endpointReference = new EndpointReference(url);//url后缀不加"?wsdl"
            Options options = rpcServiceClient.getOptions();
            options.setTimeOutInMilliSeconds(30000);
            options.setProperty(HTTPConstants.SO_TIMEOUT, 30000);
            options.setTo(endpointReference);
            rpcServiceClient.setOptions(options);
            QName qName = new QName(namespance, methodName);
            Class[] classStr = new Class[] {String.class};
            Object[] params = new Object[] {parameters};
            Object[] objects = rpcServiceClient.invokeBlocking(qName,params,classStr);
            return objects;
        } catch (Exception e) {
            logger.error("requestFunctionWebService请求接口异常:"+ e.toString());
            return null;
        }
    }

CXF:

参考路径:

https://zhoshijie.iteye.com/blog/2189091

添加依赖:

     <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>3.1.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http-jetty</artifactId>
            <version>3.1.16</version>
        </dependency>
public static Object[] getService(String url,String parameters, String namespace,String methodName) {
        try {
            String newUrl =url+"?wsdl";
            JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();  
            Client client = dcf.createClient(newUrl);  
            QName name=new QName(namespace, methodName);
            Object[] params = new Object[] {parameters};
            return client.invoke(name,params);
        } catch (Exception e) {
            logger.error(e);
            return null;
        } 
    }

XFire:

参考路径:

https://blog.csdn.net/zl834205311/article/details/51612207

https://blog.csdn.net/u010402228/article/details/50155767

http://www.cnblogs.com/toyz/p/6340269.html

① 通过WSDL地址来创建动态客户端 
② 通过服务端提供的接口来创建客户端 
③ 使用Ant通过WSDL文件来生成客户端

第一种方式:通过WSDL地址来创建动态客户端

package com.jadyer.client;  
import java.net.MalformedURLException;  
import java.net.URL;  
import org.codehaus.xfire.client.Client;  
/** 
 * 通过WSDL来创建动态客户端 
 * @see 此时需要在项目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries 
 */  
public class ClientFromWSDL {  
    public static void main(String[] args) throws MalformedURLException, Exception {  
        Client client = new Client(new URL("http://127.0.0.1:8080/XFire_demo/services/XFireServer?wsdl"));  
        Object[] results11 = client.invoke("sayHello", new Object[]{"Jadyer22"});  
        System.out.println(results11[0]);  
    }  
}  

第二种方式:通过服务端提供的端口来创建客户端

package com.jadyer.client;  
import java.net.MalformedURLException;  
import java.util.List;  
import org.codehaus.xfire.client.XFireProxyFactory;  
import org.codehaus.xfire.service.Service;  
import org.codehaus.xfire.service.binding.ObjectServiceFactory;  
import com.jadyer.model.Person;  
import com.jadyer.model.User;  
import com.jadyer.server.HelloService;  
/** 
 * 通过Web服务端提供的接口来创建客户端 
 * @see 客户端必须提供一个与服务端完全一致的接口,包名也要一致 
 * @see 在本例中,需要在客户端(即该项目)中提供HelloService.java接口,以及Person和User两个POJO类 
 * @see 并且此时需要在项目中引入XFire 1.2 Core Libraries和XFire 1.2 HTTP Client Libraries 
 */  
public class ClientFromInterface {  
    public static void main(String[] args)throws MalformedURLException{  
        //首先使用XFire的ObjectServiceFactory从HelloService接口创建一个服务模型serviceModel  
        //serviceModel包含服务的说明,换句话说,就是服务的元数据  
        //Create a metadata of the service  
        Service serviceModel = new ObjectServiceFactory().create(HelloService.class);  
          
        //访问的地址  
        String serviceURL = "http://127.0.0.1:8080/XFire_demo/services/XFireServer";  
          
        //通过查看org.codehaus.xfire.client.XFireProxyFactory源码发现  
        //下面两行代码与这里直接new XFireProxyFactory()的作用是等效的  
        //XFire xfire = XFireFactory.newInstance().getXFire();  
        //XFireProxyFactory factory = new XFireProxyFactory(xfire);  
        //为XFire获得一个代理工厂对象  
        //Create a proxy for the deployed service  
        XFireProxyFactory factory = new XFireProxyFactory();  
          
        //通过proxyFactory,使用服务模型serviceModel和服务端点URL(用来获得WSDL)  
        //得到一个服务的本地代理,这个代理就是实际的客户端  
        HelloService client = (HelloService)factory.create(serviceModel, serviceURL);  
          
        /** 
         * Invoke the service 
         * @see 调用服务的本地代理(即实际的客户端)中的方法,便得到我们需要的WebServcie 
         */  
          
        /*--处理简单对象--*/  
        String serviceResponse = client.sayHello("Jadyer11");  
        System.out.println(serviceResponse);  
          
        /*--处理对象--*/  
        User u = new User();  
        u.setName("Jadyer99");  
        Person pp = client.getPerson(u);  
        System.out.println(pp.getName());  
          
        /*--处理List--*/  
        List<Person> personList = client.getPersonList(24, "Jadyer88");  
        for(Person p : personList){  
            System.out.println(p.getName());  
        }  
    }  
}  

这是它要用到的接口和两个POJO类

/** 
 * Web服务提供给客户端的接口 
 * @see 这是第二种方式创建的客户端,要用到的接口 
 */  
package com.jadyer.server;  
import java.util.List;  
import com.jadyer.model.Person;  
import com.jadyer.model.User;  
public interface HelloService {  
    public String sayHello(String name);  
    public Person getPerson(User u);  
    public List<Person> getPersonList(Integer age, String name);  
}  
/** 
 * 第二种方式创建的客户端,要用到的两个POJO类 
 */  
package com.jadyer.model;  
public class User {  
    private String name;  
    /*--getter和setter略--*/  
}  
package com.jadyer.model;  
public class Person {  
    private Integer age;  
    private String name;  
    /*--getter和setter略--*/  
}  

Axis:

Java WebService接口生成和调用:

参考路径:

https://blog.csdn.net/qazwsxpcm/article/details/70370490

调用:

引用jar包:axis.jar 、jaxrpc.jar

一、使用eclipse自动生成的wsdl接口

1、

2、

3、

调用接口

private static String requestFunctionWebService(String http,String message) {
        //http="http://203.48.27.97:85/dagl/service/TDHYxService?wsdl"
        String retMessage = "";
        try {
            YxBrowseWSProxy yx = new YxBrowseWSProxy(http);
            retMessage = yx.yxBrowse(message);//方法名yxBrowse
        } catch (Exception e) { 
            logger.error("requestFunctionWebService请求接口异常:"+ e.getMessage());
            e.printStackTrace();
        }
        return retMessage;
    }

二、直接AXIS调用远程的web service 

import java.util.Date;   
import java.text.DateFormat;   
import org.apache.axis.client.Call;   
import org.apache.axis.client.Service;   
import javax.xml.namespace.QName;   
import java.lang.Integer;   
import javax.xml.rpc.ParameterMode;   
    
public class caClient {   
               
       public static void main(String[] args) {   
    
              try {   
                     String endpoint = "http://localhost:8080/ca3/services/caSynrochnized?wsdl";   
                     //直接引用远程的wsdl文件   
                    //以下都是套路    
                     Service service = new Service();   
                     Call call = (Call) service.createCall();   
                     call.setTargetEndpointAddress(endpoint);   
                     call.setOperationName("addUser");//WSDL里面描述的接口名称   
                     call.addParameter("userName", org.apache.axis.encoding.XMLType.XSD_DATE,   
                                   javax.xml.rpc.ParameterMode.IN);//接口的参数   
                     call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型     
                     String temp = "测试人员";   
                     String result = (String)call.invoke(new Object[]{temp});   
                     //给方法传递参数,并且调用方法   
                     System.out.println("result is "+result);   
              }   
              catch (Exception e) {   
                     System.err.println(e.toString());   
              }   
       }   
}  
原文地址:https://www.cnblogs.com/lijianda/p/9811582.html