用java(SOAP方式)的WebService的发布与使用的小Demo

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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章