前提: 前两天公司让微信公众号对个人发送消息模板的接口,供其他系统访问,刚开始领导说直接用个action实现,我觉的不安全,加上了des对称加密算法和时间戳做拦截器 把需要的参数编成json,加密后传递,但是后面觉得这种方法太low了,因为还要把des加密的那一块也得在其他系统上面引入,约定算法的key,这个方法显得很野,就百度了webservice的原理及用法,感觉这个最合适,然后自己写了一个demo跑通了,但是有个问题是直接用webservice发布服务器端,不能和tomcat的端口号一样,这个显然不太合适,就百度了cfx,让cfx和spring整合,最后由spring管理webservice的发布。
webservice本以为很高大声,研究了一下原理其实很简单,就是服务器端(提供接口端)写一个service方法,而这个方法本身想暴露给客户端(使用接口端)调用,实现不同系统直接的方法的调用。就需要先有个webservice类,然后用@webservice注解类,用@WebMethod注解类中暴露的方法,最后把这个类通过webservice的方法发布出去,外界获取了一个wsdl(接口详情清单页)的地址,根据这个页面的信息,通过cmd等命令把webservice编译的代码下载到客户端,最后客户端直接调用生成的代码即实现了不同系统直接方法的调用。
这里不再赘叙,网上这位朋友讲的很透彻,可以参考:https://blog.csdn.net/yhahaha_/article/details/81395397
客户端调用
经过测试分了三种方式:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 URL wsdlURL = null; 2 try { 3 wsdlURL = new URL("http://localhost:6060/fms/soap/wechat_sendMessage?wsdl"); 4 } catch (MalformedURLException e) { 5 e.printStackTrace(); 6 } 7 //目标命名空间 这两个wsdl文件里面有说明 8 String targetNamespace = "http://impl.service.commom.webchat.bms.vimtech.com/"; 9 QName serviceName = new QName(targetNamespace,"SendMessageFaceImplService"); 10 11 //获取service 12 Service service = Service.create(wsdlURL, serviceName); 13 SendMessageFace ms = service.getPort(SendMessageFace.class);//这个service接口是需要在客户端创建的,包名类名,方法名一致,或者引入服务端的此接口的jar 14 String string = ms.sendMessageByWeTemp("xiaoming", "asdfardf"); 15 System.out.println(string);
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 wsimport -s 客户端地址 -p 客户端包名 -keep wsdl的网络地址 2 3 如: 4 wsimport -s D:\Workspaces\TheClient\src -p com.sl.client -keep http://localhost:9094/Service2/ServiceBora?wsdl
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 .spring配置文件信息: 2 <jaxws:client id="wechat_sendMessagePoint" serviceClass="com.wp.learn.webservice.cxf.service.SendMessageFaceImpl" address="http://localhost:8080/ws/wechat_sendMessage"> 3 </jaxws:client> 4 5 6 //注意,该出的targetNamespace的值必须和webService服务项目中定义的必须一致,否则调用不成功 7 @WebService(targetNamespace = "http://impl.service.commom.webchat.bms.vimtech.com/", name = "SendMessageFaceImplService") 8 public interface SendMessageFace{ 9 @WebMethod 10 String sendMessageByWeTemp(String userid,String message); 11 }