呼叫遠端 .NET 的服務
This document is provided as is. You are welcomed to use it for non-commercial purpose.Written by: 國立中興大學資管系呂瑞麟
請勿轉貼
在之前的範例中,我們以 Axis 開發 service 並依據該 service 開發 client。在這一篇文章中,我們試著以 Axis 來開發遠端 .NET 服務的 client 程式。我們在另一篇文章會探討如何以 .NET 來開發遠端 Axis 服務的 client 程式。 開發 client 程式的方式跟以前的說明類似,至於可能遇見的狀況,我們 以範例說明。目前提供各式各樣的 web services 的入口網頁有 XMethods (似乎已經結束營業了) 、Lightweight Service Registry、以及 WebserviceX.NET。
- 範例一:Whois Service 這是一個由 .NET 開發的服務,其提供一個 operations: getWhoIS()。getWhoIS() 需要一個參數,就是查詢的 domain name。
- 利用 WSDL2Java 來產生必要的 proxy 類別:
wsdl.bat http://www.webservicex.net/whois.asmx?WSDL
- 產生的 proxy 類別被置放於 net\webservicex\www,共有 Whois.java, WhoisLocator.java, WhoisSoap.java, WhoisSoap12Stub.java, 和 WhoisSoapStub.java。
- 客戶端程式:NetWhois.java
import java.rmi.*; import javax.xml.rpc.*; import net.webservicex.www.*; public class NetWhois { public static void main(String[] args) throws RemoteException, ServiceException { // 請注意之前使用的規則略有不同,比較好的方式是去看一下 // proxy 類別的原始碼 Whois service = new WhoisLocator(); WhoisSoap call = service.getwhoisSoap(); // 呼叫 whois() System.out.println(call.getWhoIS("www.nchu.edu.tw")); } }
- 利用 WSDL2Java 來產生必要的 proxy 類別:
- 範例二:StockQuote 該服務提供 GetQuote(),而該 operation 需要一個代表股票名稱的
字串,例如 GOOG, IBM 等。
- 利用 WSDL2Java 來產生必要的 proxy 類別:
wsdl.bat http://www.webservicex.net/stockquote.asmx?WSDL
- 產生的 proxy 類別被置放於 net\webserviceX\www,共有 StockQuote.java, StockQuote.java, StockQuoteSoap.java, 和 StockQuoteSoapStub.java。
- 客戶端程式:NetStock.java
import java.rmi.*; import javax.xml.rpc.*; import NET.webserviceX.www.*; import javax.swing.*; public class NetStock { public static void main(String[] args) throws RemoteException, ServiceException { StockQuote service = new StockQuoteLocator(); StockQuoteSoap call = service.getStockQuoteSoap(); // 呼叫 getQuote() String input = JOptionPane.showInputDialog("請輸入股票名稱\neg. GOOG, IBM, etc."); System.out.println(call.getQuote(input)); } }
- 利用 WSDL2Java 來產生必要的 proxy 類別:
- 範例三:CDYNE Weather 是個蠻複雜的服務,請仔細看一下它的 WSDL,你會發現它包含回傳物件、
物件陣列,而且也包含了日期物件。
- 利用 WSDL2Java 來產生必要的 proxy 類別:
wsdl.bat http://ws.cdyne.com/WeatherWS/Weather.asmx?wsdl
- 產生的 proxy 類別被置放於 com\cdyne\ws\WeatherWS,共有
Forecast.java, ForecastReturn.java, POP.java, Temp.java, Weather.java,
WeatherDescription.java, WeatherLocator.java, WeatherReturn.java,
WeatherSoap.java, WeatherSoapStub.java, 和 WeatherSoap12Stub.java。
由於類別蠻多的,我們稍微解釋一下:WeatherLocator.java 是用來找到
Weather.java 服務的,而經由 Weather.java 的 get 方法,找到對應於
遠端物件的 WeatherSoap.java;而 Forecast.java, ForecastReturn.java,
POP.java, Temp.java, WeatherDescription.java, 和 WeatherReturn.java 都是
service 回傳的物件。我們仍然不會直接使用 WeatherSoapStub.java, 和
WeatherSoap12Stub.java。
該服務提供 GetWeatherInformation(), GetCityForecastByZIP(),
以及 GetCityWeatherByZIP() 三個 operations;後兩個都需要 ZIP code
作參數,例如 94102,其它的,可以查 United States Postal Service: ZIP Code Lookup。
- 客戶端程式:NetWeather.java
import java.rmi.*; import javax.xml.rpc.*; import com.cdyne.ws.WeatherWS.*; import javax.swing.*; public class NetWeather { public static void main(String[] args) throws RemoteException, ServiceException { Weather service = new WeatherLocator(); WeatherSoap call = service.getWeatherSoap(); // 呼叫 GetCityWeatherByZIP() String input = JOptionPane.showInputDialog("請輸入 ZIP Code\neg. 94102, etc."); WeatherReturn w = call.getCityWeatherByZIP(input); if(w.isSuccess()) { System.out.println("州名:" + w.getState()); System.out.println("城市:" + w.getCity()); System.out.println("氣溫:" + w.getTemperature()); System.out.println("濕度:" + w.getRelativeHumidity()); System.out.println("其它:" + w.getRemarks()); } else { System.out.println("錯誤訊息:" + w.getResponseText()); } } }
- 客戶端程式:NetForecast.java
import java.rmi.*; import javax.xml.rpc.*; import com.cdyne.ws.WeatherWS.*; import javax.swing.*; import java.util.*; public class NetForecast { public static void main(String[] args) throws RemoteException, ServiceException { Weather service = new WeatherLocator(); WeatherSoap call = service.getWeatherSoap(); // 呼叫 getCityWeatherByZIP() String input = JOptionPane.showInputDialog("請輸入 ZIP Code\neg. 94102, etc."); ForecastReturn w = call.getCityForecastByZIP(input); if(w.isSuccess()) { System.out.println("州名:" + w.getState()); System.out.println("城市:" + w.getCity()); Forecast[] f = w.getForecastResult(); Calendar c = null; Temp p = null; for(int i=0; i<f.length; i++) { c = f[i].getDate(); System.err.println("日期:" + c.get(Calendar.YEAR) + "/" + (c.get(Calendar.MONTH) + 1) + "/" + c.get(Calendar.DATE)); System.err.println("狀態:" + f[i].getDesciption()); p = f[i].getTemperatures(); System.err.println("最低溫:" + p.getMorningLow()); System.err.println("最高溫:" + p.getDaytimeHigh() + "\n"); } } else { System.out.println("錯誤訊息:" + w.getResponseText()); } } }
- 利用 WSDL2Java 來產生必要的 proxy 類別:
Written by: 國立中興大學資管系呂瑞麟
沒有留言:
張貼留言