java-webService(调用wsdl接口)

本文对比了Axis2、XFire、CXF等WebService框架的特点,详细介绍了它们的使用场景和优缺点。并通过实例展示了如何使用这些框架进行WebService的生成和调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用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.youkuaiyun.com/rockstar541/article/details/21106407

axis2:

参考路径:

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

https://blog.youkuaiyun.com/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

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.youkuaiyun.com/zl834205311/article/details/51612207

https://blog.youkuaiyun.com/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.youkuaiyun.com/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

### Java 调用 Webservice WSDL 并添加请求头 当在Java环境中调用基于WSDL定义的Web Service时,可以通过多种方式来实现向HTTP请求中附加自定义头部信息的功能。以下是几种常见的方式: #### 使用JAX-WS API 设置 SOAP Header 对于SOAP协议下的Web Services,在客户端可以利用`javax.xml.ws.BindingProvider`类提供的功能来设置消息级别的属性以及传输层的信息。 ```java // 创建服务代理实例 HelloWorldService service = new HelloWorldService(); HelloWorld port = service.getHelloWorldPort(); // 获取绑定提供者对象 BindingProvider bindingProvider = (BindingProvider)port; // 定义并应用请求头 Map<String, Object> requestContext = bindingProvider.getRequestContext(); requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://example.com/service"); requestContext.put("customHeaderName", "headerValue"); String response = port.sayHello("John Doe"); System.out.println(response); ``` 此代码片段展示了如何创建一个简单的Web Service客户端,并通过修改`RequestContext`中的键值对来指定额外的HTTP头部字段[^1]。 #### 利用第三方库 Axis 或 CXF 实现更复杂的场景 如果项目需求较为复杂或者希望获得更多的灵活性,则可以选择采用像Apache Axis或Apache CXF这样的框架来进行开发。这些工具包提供了更为丰富的API用于处理各种情况下的通信细节。 以CXF为例,可以在发送请求之前配置拦截器链(interceptor chain),从而允许开发者轻松地操作进出的消息体及其元数据(包括但不限于HTTP Headers)。下面是一个简化的例子说明怎样做这一点: ```java import org.apache.cxf.endpoint.Client; import org.apache.cxf.frontend.ClientProxy; import org.apache.cxf.message.Message; import org.apache.cxf.phase.PhaseInterceptorChain; ... Client client = ClientProxy.getClient(port); client.getInInterceptors().add(new LoggingInInterceptor()); client.getOutInterceptors().add(new AbstractPhaseInterceptor<Message>(Phase.PRE_PROTOCOL) { @Override public void handleMessage(Message message) throws Fault { Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS)); if(headers == null){ headers = new HashMap<>(); message.put(Message.PROTOCOL_HEADERS, headers); } headers.put("Custom-Header-Key", Collections.singletonList("HeaderValue")); } }); ``` 上述示例演示了如何借助于CXF框架为每一个即将发出的服务请求动态注入特定的HTTP header项[^2]。 #### 手动构建 HTTP 请求 最后一种方法就是完全绕过现有的WebService栈,转而直接使用HttpURLConnection或者其他类似的低级网络编程接口去构造原始的HTTP POST/GET请求,并手动拼接XML/SOAP Envelope作为负载内容传递给目标服务器。不过这种方法通常只适用于非常特殊的情况下才会考虑使用,因为它不仅增加了编码难度还容易引入安全隐患。 综上所述,针对不同的应用场景和技术选型,有多种途径可供选择以便有效地完成这项任务。建议根据实际项目的具体情况权衡利弊之后再做出决定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值