本文共 3566 字,大约阅读时间需要 11 分钟。
关于WebService,工作关系,断断续续有接触到一些,写完就忘,下次要写又不记得。
所以做个简单的案例,啥时候忘了能查一查。
酱紫,先大概讲一下我理解的WebService,因为接触时间不长,可能有些方面理解有误,希望各位提出,我发现了也会更正。一同进步吧!
首先,用我这小学英语的水平直译一下,web --> 网路,service --> 服务。连起来,网络服务。通过网络来调用的服务。
在功能上,例如在我们的Java程序中,有各种各样的方法,来处理各种业务逻辑或者数据。
比如,你的程序里有一个方法,调用这个方法,可以返回一个你想要的结果。
那么,你可以通过WebService的功能,将这个方法发布出去。
然后,另外一个程序,只要跟你网络互通,那就可以根据你发布的内容,生成客户端代理。然后通过客户端,调用你程序里发布的这个方法,通过你的程序的处理,达到跟你自己在程序里面调用方法一样的效果。
简单来说,也就是,把你的程序的某个方法发布出去,让别人的程序也能调用这个方法。
(一)提供服务(模拟)
例如,你有个算命的技能,你可以根据一个人的生辰八字算他什么时候一夜暴富。
这个就类似一个程序,有一个算命的方法,输入参数为生辰八字,返回值为暴富的时间。
那别人想算命呢,他们有生辰八字,但他们不知道怎么算呀。而且咱也不是你说算就帮你算的是吧。
然后呢,哪一天你缺钱了,你想通过帮人家算命来赚点钱,你就可以通过一个什么方式,发布了个声明,告诉大家,我会算命喔,只要你给我你的生辰八字,顺便再给我点钱,我就帮你算,然后告诉你什么时候发财。
这个时候,大家就知道你这里可以算命了。然后他们就通过你发布的声明,知道哦原来你要生辰八字,哦还要钱,然后他们就开始准备你要的这些东西,传递给你,你就帮他们算命,给他们返回一个结果。
(二)数据接口
这种在做一些数据收集平台类的功能会用得到。
例如,一个省级单位,有个省级的数据收集平台,需要各个地市将数据上报到这个平台。但关于这个业务,各地市根据自身业务开展情况建了自己的系统。
针对这种情况,为了提高各地市上报数据的效率,减少重复的工作,省级平台就可以对外发布一个数据接口,各地市就可以根据发布的接口的相关规范、文档,以对应的方式调用,传递对应的参数,即可通过后台传输对接的方式将数据上报,减少手工上报的操作。
例如我有一个可以计算年龄的方法,int getAge(Date birthday),然后我就把它用WebService的方式发布出去。
(一)代码如下:
重点是类名上面的@WebService注解,以及main方法里面发布地址及publish发布:
package cn.lihuayou.ws;import javax.jws.WebService;import javax.xml.ws.Endpoint;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;@WebServicepublic class GetAge { // 根据出生日期(指定格式:yyyy-MM-dd)计算年龄 // 懒得做各种校验检查了,我就假设传进来的参数都是对的 public int getAge(String birthdayStr) throws ParseException { int age = 0; Calendar cal = Calendar.getInstance(); // 取当前年月日 int yearNow = cal.get(Calendar.YEAR); int monNow = cal.get(Calendar.MONTH); int dayNow = cal.get(Calendar.DAY_OF_MONTH); // 取出生日期年月日 Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse(birthdayStr); cal.setTime(birthday); int yearBirth = cal.get(Calendar.YEAR); int monBirth = cal.get(Calendar.MONTH); int dayBirth = cal.get(Calendar.DAY_OF_MONTH); // 计算年龄 age = yearNow - yearBirth; // 今年还没过生日,就减1 if (monNow <= monBirth) { if (monNow == monBirth) { if (dayNow < dayBirth) { age--; } }else { age--; } } // 返回 return age; } // 发布 public static void main(String[] args) throws ParseException { // 指定发布地址 String address = "http://127.0.0.1:8888/wsdemo/age"; // 发布 Endpoint.publish(address, new GetAge()); }}
(二)接口描述文档WSDL
运行之后,通过浏览器访问描述文档WSDL,地址为发布地址后面带一个WSDL的参数,即:http://127.0.0.1:8888/wsdemo/age?WSDL,大概的关系图如下,我理解得也不是很到位,就不误导了:
(三)生成本地代理(客户端)
通过jdk自带的wsimport功能及WSDL的描述,可生成本地代理。
命令:
1、默认参数调用,解析生成class字节码文件,存放在cmd当前路径: cmd> wsimport WSDL地址
2、别的参数:
(1)-s 同时生成源码
(2)-p cn.lihuayou.xxx 重新指定报名
(3)-d 指定输出的路径
例如我在d盘根目录调用,默认参数,如下图:
(四)打包导入
然后就是把这个东西,导入到你的程序里面去。可以直接复制进去,也可以打包个jar导入使用。
顺便记录一下jar命令打包的操作。
命令:cmd > jar cvf 指定jar文件名 打包的class文件路径/文件名
打包完成后jar包就在d盘根目录,然后,把它导入到Java项目中,记得add as library。
(五)测试调用
package cn.lihuayou.wsclient;import cn.lihuayou.ws.GetAge;import cn.lihuayou.ws.GetAgeService;// 测试调用对方的方法public class WSClient { public static void main(String[] args) throws Exception { // 创建服务对象 GetAgeService service = new GetAgeService(); // 获取访问方式,也就是这个业务对应的类对象 GetAge port = service.getGetAgePort(); // 调用方法 int age = port.getAge("1995-07-21"); // 输出结果 System.out.println("调用结果:" + age); }}
一执行,他就能通过指定的访问路径,调用服务端发布的服务,通过服务端的处理,得到想要的结果。
好了,整个流程差不多就是这个亚子,以后有机会再做一些补充吧。
转载地址:http://imkgf.baihongyu.com/