WebService技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。它可以使用.NET或C#编写发布,也可以使用java,它是平台无关的。WebService也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,比如XML、HTTP。
http://www.webxml.com.cn/zh_cn/web_services.aspx 这个网址收集了一些国内发布的公开的平台信息,比如列车时刻表,手机号码归属地等。
这篇博客就记录一下如何用java发布/调用WebService。
注:WebService有两种传输协议,一种是SOAP,一种是REST,这篇手记记录SOAP协议下的使用。
一、WebService的发布
service的标准接口规范都记录在该service的WSDL文档里。我调用别人的webService需要获得它的WSDL文档,别人调用我的service,也需要获取我的wsdl文档。
那wsdl文档的发布非常简单,在java中有Endpoint类的publish方法,轻松发布自己的webService。
在如上图所示的工程目录中,Service是要发布的web方法,publishMethod.java是为了将其发布出去的代码。
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService
public class Services {
@WebMethod
public String sayHello(String name){
return "你好,"+name+"大佬!";
}
}
需要发布的代码中,@WebService和@WebMethod都是必需的注解,类前加注解代表这个类都是需要被发布的,方法前加注解代表该方法是被发布的。如果方法前不加@WebMethod注解,则该方法仅为内部使用而不提供对外的接口。
import javax.xml.ws.Endpoint;
public class PublishMethod {
public static void main(String[] args) {
// TODO Auto-generated method stub
//http://localhost:8090/MyService?wsdl
String url = "http://localhost:8090/MyService";
Endpoint.publish(url, new Services());
System.out.println("publish method success!");
}
}
在publishMethod.java中,通过Endpoint调用publish方法可以指定发布的url地址,第二个参数必须为Service类的实例化对象。这里通过Tomcat发布到localhost的8090端口。
作为java application运行一下就提示“发布成功”了,浏览器打开该url路径——
URL后缀加上“?wsdl”可显示基于该Service生成的wsdl文档——
生成了该文档,其他人通过该wsdl文档即可调用,当然,该url最好映射到他人可访问的公网IP上。
二、WebService的调用
JDK在某版本后就自带了解析wsdl文档的工具,在jdk路径的lib下可以看到一个名为wsimport的工具。
在那个集合了很多公开wsdl文档的网站里随便找了一些作为自己调用的。也先拿自己发布的WebService验证一下能否使用。
新建了一个工程,然后用wsimport命令把wsdl文档解析成java代码存放进src文件夹——
瞬间生成了这么多java源代码文件(java代码需要的描述语句全使用WSDL定义封装,实现自动化装配)——
编写一个客户端试验一下运行结果:
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Services service = new ServicesService().getServicesPort();
System.out.println(service.sayHello("吴钟煌"));
}
}
OK!
那第三方其他的也来试试,出现WARNING了,但生产的代码依旧可以使用——
这个截图没截完,四个wsdl生成的java代码都挤在这里。可以看到生成了一些Interface接口,其实每一个Webservice生成的调用都会有一个接口,该接口里声明了在@WebMethod注解下被定义了的同名方法,由于WebService是基于SOAP协议的,故在SOAP类中可返回该接口的(子类的)实体类对象,通过该对象即可使用这些方法。WebService的本质就是通过UDDI注册、通过WSDL规范化的、基于SOAP协议、可供远程调用的API。
本地写一个client验证一下可用性——
/**
* 自己发布的服务调用的test
*/
System.out.println("================调用自己的Web服务SayHello=================");
Services service = new ServicesService().getServicesPort();
System.out.println(service.sayHello("邓泽"));
/**
* 国内手机号归属地查询WebService的test
*/
System.out.println("================查询号码归属地:18171870558=================");
MobileCodeWSSoap mobileCodeSoap = new MobileCodeWS().getMobileCodeWSSoap();
System.out.println(mobileCodeSoap.getMobileCodeInfo("18171870558", null));
/**
* 查询QQ在线状态WebService的test
*/
System.out.println("================查询QQ在线:2547048602=================");
QqOnlineWebServiceSoap qqSoap = new QqOnlineWebService().getQqOnlineWebServiceSoap();
switch (qqSoap.qqCheckOnline("2547048602")) {
case "Y":
System.out.println("2547048602 - 在线");
break;
case "N":
System.out.println("2547048602 - 离线");
case "E":
System.out.println("QQ号码错误");
default:
System.out.println("。。");
break;
}
/**
* 中英文互译WebService的test
*/
System.out.println("================英译中:Chinese=================");
TranslatorWebServiceSoap translateSoap =
new TranslatorWebService().getTranslatorWebServiceSoap();
cn.com.webxml.ArrayOfString results = translateSoap.getEnCnTwoWayTranslator("chinese");
List<String> myresult =results.getString();
int i = 0;
for (String r : myresult) {
System.out.println(myresult.get(i));
i++;
}
/**
* IP地址来源搜索WebService的test
*/
System.out.println("================查IP定位信息:216.146.46.211=================");
IpAddressSearchWebServiceSoap ipSoap =
new IpAddressSearchWebService().getIpAddressSearchWebServiceSoap();
train.cn.com.webxml.ArrayOfString arrays = ipSoap.getCountryCityByIp("216.146.46.211");
List<String> ipAddress = arrays.getString();
int index = 0;
for (String string : ipAddress) {
System.out.println(ipAddress.get(index));
index++;
}
如图,本地调用到了远程提供的方法。也证实了通过该方法是可以成功调用WebService的。
附:
一、W3C规定的WSDL规范
二、WebService的体系结构
三、资料
WebService简单实例:
https://www.cnblogs.com/yisheng163/p/4524808.html?utm_source=tuicool
WebXML-免费WSDL库:
http://www.webxml.com.cn/zh_cn/web_services.aspx
WebService深入浅出视频讲解:
http://edu.51cto.com/center/course/lesson/index?id=25757