关于WebService,工作关系,断断续续有接触到一些,写完就忘,下次要写又不记得。
所以做个简单的案例,啥时候忘了能查一查。
酱紫,先大概讲一下我理解的WebService,因为接触时间不长,可能有些方面理解有误,希望各位提出,我发现了也会更正。一同进步吧!
一、功能
首先,用我这小学英语的水平直译一下,web --> 网路,service --> 服务。连起来,网络服务。通过网络来调用的服务。
在功能上,例如在我们的Java程序中,有各种各样的方法,来处理各种业务逻辑或者数据。
比如,你的程序里有一个方法,调用这个方法,可以返回一个你想要的结果。
那么,你可以通过WebService的功能,将这个方法发布出去。
然后,另外一个程序,只要跟你网络互通,那就可以根据你发布的内容,生成客户端代理。然后通过客户端,调用你程序里发布的这个方法,通过你的程序的处理,达到跟你自己在程序里面调用方法一样的效果。
简单来说,也就是,把你的程序的某个方法发布出去,让别人的程序也能调用这个方法。
二、应用场景
(一)提供服务(模拟)
例如,你有个算命的技能,你可以根据一个人的生辰八字算他什么时候一夜暴富。
这个就类似一个程序,有一个算命的方法,输入参数为生辰八字,返回值为暴富的时间。
那别人想算命呢,他们有生辰八字,但他们不知道怎么算呀。而且咱也不是你说算就帮你算的是吧。
然后呢,哪一天你缺钱了,你想通过帮人家算命来赚点钱,你就可以通过一个什么方式,发布了个声明,告诉大家,我会算命喔,只要你给我你的生辰八字,顺便再给我点钱,我就帮你算,然后告诉你什么时候发财。
这个时候,大家就知道你这里可以算命了。然后他们就通过你发布的声明,知道哦原来你要生辰八字,哦还要钱,然后他们就开始准备你要的这些东西,传递给你,你就帮他们算命,给他们返回一个结果。
(二)数据接口
这种在做一些数据收集平台类的功能会用得到。
例如,一个省级单位,有个省级的数据收集平台,需要各个地市将数据上报到这个平台。但关于这个业务,各地市根据自身业务开展情况建了自己的系统。
针对这种情况,为了提高各地市上报数据的效率,减少重复的工作,省级平台就可以对外发布一个数据接口,各地市就可以根据发布的接口的相关规范、文档,以对应的方式调用,传递对应的参数,即可通过后台传输对接的方式将数据上报,减少手工上报的操作。
三、一个贼简单的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;
@WebService
public 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);
}
}
一执行,他就能通过指定的访问路径,调用服务端发布的服务,通过服务端的处理,得到想要的结果。
好了,整个流程差不多就是这个亚子,以后有机会再做一些补充吧。