1. 遠程調用技術
2. WebService 概述
- WebService 是使用 Http 發送 SOAP 協議數據的一種遠程調用技術;
- WebService 需要開發客戶端;
- WebService 需要開發服務端;
- SOAP,簡單對象訪問協議,用來描述傳遞信息的格式;
- WSDL,WebService 服務端的一個使用說明書,用來描述接口,方法,參數和返回值;
- UUDI,用來管理,分發,查詢WebService;
3. WebService 入門程序(基於JDK 1.7)
// 需求:
// 服務端: 發布一個天氣查詢服務,接收客戶端城市名,返回天氣數據給客戶端;
// 客戶端: 發送城市名稱給服務端,接收服務端的返回天氣數據;
// 服務端
// 第一步: 創建 SEI(Service Endpoint Interface) 接口, 本質上就是 Java 接口;
public interface WeatherInterface{
public String queryWeather(String cityName);
}
// 第二步: 創建 SEI 實現類
// @WebService 表示該類是一個服務類,需要發布其中的 public 方法
@WebService
public class WeatherImpl implements WeatherInterface{
public String queryWeather(String cityName){
System.out.println("from client..."+cityName);
String weather = "晴";
return weather;
}
}
// 第三步: 發布服務
// 相當於 天氣服務端
public class WeatherServer{
public static void main(String[] args){
// 使用 Endpoint 發布服務
// Endpoint.publish(address,implementor);
// address: 服務地址;
// implementor: 實現類
Endpoint.publish("http://127.0.0.1:12345/weather",new WeatherImpl());
}
}
// 第四步: 測試服務是否發布成功. 通過閱讀使用說明書,確定客戶端調用的接口,方法,參數和返回值存在,
// 證明服務發布成功.
// WSDL 地址: 服務地址 + "?wsdl";
3.1 WSDL 閱讀方式
- 從下往上閱讀,先找到 service 標簽,根據 service 標簽里面的 binding 屬性找到 binding 標簽,
然后查找 binding 標簽中的 type 屬性,根據該屬性,查找 portType 標簽;
// 客戶端開發
// 第一步: wsimport 命令生成客戶端代碼
// 根據 wsdl 地址生成客戶端代碼, "."表示在當前目錄下生成
wsimport -s . http://127.0.0.1:12345/weather?wsdl
// 第二步: 根據使用說明書,說明客戶端代碼調用服務端
// 客戶端
public class WeatherClient{
public static void main(String[] args){
// 創建服務視圖, 視圖是從 service 標簽的 name 屬性獲取
WeatherImplService wis = new WeatherImplService();
// 獲取服務實現類, 實現類是從 portType 標簽的 name 屬性獲取
WeatherImpl weatherImpl = wis.getPort(WeatherImpl.class);
// 調用查詢方法,portType 標簽的子標簽 operation 中的 name 屬性獲取
String weather = weatherImpl.queryWeather("北京");
System.out.println(weather);
}
}
3.2 WebService 的優缺點
- 優點:
- 跨防火牆: webservice 發送方式采用 http 的POST發送,http的默認端口是 80,防火牆默認不攔截 80;
- 跨平台: webservice 使用XML格式封裝數據,XML是跨平台的;
- 支持面向對象;
- 缺點:
- 采用 XML 格式封裝數據,所以傳輸過程中,要傳輸額外的標簽;
- 應用場景
- 軟件集成和復用:
- 軟件集成: 通過遠程調用技術,將兩個系統整合到一起,實現軟件集成;
- 軟件復用: 同一款軟件的多次集成,最終實現軟件復用;
- 軟件集成和復用:
4. WSDL
4.1 概述
- WSDL,網絡服務描述語言;
- 是一種使用XML編寫的文檔;
- 是 webservice 服務端使用說明書,說明服務端接口,方法,參數和返回值;
- 是隨着服務發布成功,自動生成的,無需編寫;
4.2 文檔結構(從下往上閱讀)
<service>
: 服務視圖,webservice的服務節點,它包括服務端點;<binding>
: 為每個服務端點定義消息格式和協議細節;<portType>
: 服務端點,描述 webservice 可被執行的操作方法,以及相關的消息,通過binding指向 portType<message>
: 定義一個操作(方法)的數據參數(可有多個參數);<types>
: 定義 webservice 使用的全部數據類型
5. SOAP
- SOAP 即簡單對象訪問協議,是一種網絡通信協議;
- SOAP 用於跨平台應用程序之間的通信;
- SOAP = XML + HTTP, 其實就是通過 HTTP 發 xml 數據;
- SOAP 不是webservice的專有協議;
6. WebService 的兩種客戶端調用方式
6.1 公網服務地址: http://www.webxml.com.cn/zh_cn/web_services.aspx
6.2 第一種調用方式
-
Wsimport 命令介紹
- Wsimport 是 JDK 提供的一個工具,作用就是根據WSDL地址生成客戶端代碼;
- 位置:
JAVA_HOME/bin
; - 僅支持SOAP1.1客戶端的生成;
- 常用參數:
-s
,用於生成 java 文件的;-d
,用於生成 class 文件的,默認的參數;-p
,指定包名的,如果不加該參數,默認包名就是WSDL文檔中命名空間的倒序;
-
調用公網手機號歸屬地查詢服務
// 第一步: wsimport 生成客戶端代碼
// 存儲在 cn.itcast.mobile 包下
wsimport -p cn.itcast.mobile -s . http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx\?wsdl
// 第二步: 根據使用說明書,說明客戶端代碼調用服務端
public class MobileClient{
public static void main(String[] args){
// 1. 創建服務視圖
MobileCodeWS mcw = new MobileCodeWS();
// 2. 獲取服務實現類
MobileCodeWSSoap mcws = mcw.getPort(MobileCodeWSSoap.class);
// 3. 調用查詢方法
String result = mcws.getMobileCodeInfo("1234567","");
System.out.println(result);
}
}
// 第一種方式使用簡單,但一些關鍵的元素在代碼生成時,固定到生成代碼中,不方便維護;
6.3 第二種方式: service 編程調用方式(標准開發方式)
public class ServiceClient{
public static void main(String[] args) throws IOException{
// 1. 創建WSDL的URL, 注意不是服務地址
URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl");
// 2. 創建服務名稱
// 參數: namespaceURI, 命名空間地址
// localPart, 服務視圖名
QName qname = new QName("http://WebXml.com.cn/","MobileCodeWS");
// 3. 創建服務視圖
// 參數: wsdlDocumentLocation: wsdl 地址
// serviceName: 服務名稱
Service service = Service.create(url,qname);
// 獲取服務實現類
MobileCodeWSSoap wcss = service.getPort(MobileCodeSSoap.class);
// 調用查詢方法
String result = wcss.getMobileCodeInfo("1233455","");
System.out.println(result);
}
}