用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

 

 

 

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