GrayHJX 2016-07-28 11:19 采纳率: 100%
浏览 1289
已采纳

关于webservice怎么做的问题

cxf实现的RESTful WebService如何做到设置token赋予不一样的权限

  • 写回答

3条回答 默认 最新

  • qq_22668529 2016-07-29 03:48
    关注

    可以到apache官网上下载apache CXF 包,不知道你用什么语言开发,去对应的地方下载就行啦!
    1.apache CXF webService多系统交互服务,
    2.从apache CXF 官网上下载CXF用到的java包
    最少需要:cxf-2.7.18.jar ,neethi-3.0.3.jar,stax2-api-3.1.4.jar,woodstox-core-asl-4.4.1.jar,wsdl4j-1.6.3.jar,xmlschema-core-2.1.0.jar,将这些cxf的jar包放到webservice的项目中,然后项目通过building path引入这些jar包,
    3.在项目的web.xml中引入CXF的servlet

    CXFServlet

    org.apache.cxf.transport.servlet.CXFServlet

    1


    CXFServlet

    / ws/*

    启动tomcat,
    4.CXF服务端的配置文件: applicationContext-server.xml

    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <beans xmlns="http://www.springframework.org/schema/beans"  
    3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    4.     xmlns:jaxws="http://cxf.apache.org/jaxws"  
    5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
    6.                        http://www.springframework.org/schema/beans/spring-beans.xsd  
    7.                        http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">  
    8.     <!--   
    9.         ***注意***   
    10.         手动添加的内容:  
    11.         xmlns:jaxws="http://cxf.apache.org/jaxws"  
    12.         http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"  
    13.      -->  
    14.       
    15.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
    16.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
    17.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
    18.   
    19.     <jaxws:endpoint id="helloService" implementor="com.test.server.HelloWorldServerImp" address="/helloService" />  
    20.           
    21. </beans>  
    22. 5.将服务端的配置文件在spring的applicationcontext.xml文件引入cxf服务端配置文件,加载cxf配置文件,
    23. < import resource ="com/test/server/applicationContext-server.xml"/>
    24. 6.测试服务端的服务接口
    25. http://localhost:8080/webService/ws/helloService?wsdl查看某一个接口的类
    26. 
    
    27. http://localhost:8080/webService/ws查看多个接口类
    28. 
    
    29. 7.
    

    org.springframework.context.ApplicationContext ;spring的jar包提供应用上下文类,用于读取.xml文件的属性信息,
    30. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-client.xml" );
    31. IHelloWorldServer helloService = (IHelloWorldServer) context.getBean( "client");
    32. 8.客户端调用服务端的异常 Could not find wsdl:binding operation info for web method sayHello,
    33. 解决方法:在服务端的接口要添加
    34. import javax.jws.WebService;
    35. @WebService//否则就会包那个异常
    36. 9.客户端调用服务端的代码
    37. CXF通过运行时代理生成远程服务的代理对象,在客户端完成对webservice的访问
    package com.flyfox.client;

    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

    import com.flyfox.service.IHelloWorldService;

    public class HelloWorldServiceClient {

    public static void main(String[] args) throws Exception {
    //调用WebService
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(IHelloWorldService.class);
    factory.setAddress("http://localhost:9000/helloWorld");

    IHelloWorldService service = (IHelloWorldService) factory.create();
    System.out.println("[result]" + service.sayHello("flyfox"));

    }
    }
    小结:这种调用service的好处在于调用过程非常简单,就几行代码就完成一个webservice的调用,但是客户端也必须依赖服务器端的接口,这种调用方式限制是很大的,要求服务器端的webservice必须是java实现--这样也就失去了使用webservice的意义
    查看了官方的文档后,发现其实是可以实现不依赖服务器端接口来完成调用的,如下
    使用JaxWsDynamicClientFactory类,只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可,so simple!!

    package com.flyfox.client;

    import org.apache.cxf.endpoint.Client;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
    import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;

    import com.flyfox.service.IHelloWorldService;

    public class HelloWorldServiceClient {

    public static void main(String[] args) throws Exception {
    //不依赖服务器端接口来完成调用的,也就是不仅仅能调用Java的接口
    JaxWsDynamicClientFactory clientFactory = JaxWsDynamicClientFactory.newInstance();//创建客户端工厂类

    Client client = clientFactory.createClient("http://localhost:9000/helloWorld?wsdl");//通过客户端的工厂类的createClient方法,参数是服务的wsdl地址,创建客户端对象,Object[] result = client.invoke("sayHello", "KEVIN");//客户端对象的invoke方法,参数是服务端的方法和方法的参数,返回一个结果数组
    System.out.println(result[0]);
    }
    }

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 给我一个openharmony跑通webrtc实现视频会议的简单demo项目,sdk为12
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题