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