2012年9月26日 星期三

呼叫遠端 .NET 的服務

呼叫遠端 .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
  1. 範例一:Whois Service 這是一個由 .NET 開發的服務,其提供一個 operations: getWhoIS()。getWhoIS() 需要一個參數,就是查詢的 domain name。
    1. 利用 WSDL2Java 來產生必要的 proxy 類別:
        wsdl.bat http://www.webservicex.net/whois.asmx?WSDL
        
    2. 產生的 proxy 類別被置放於 net\webservicex\www,共有 Whois.java, WhoisLocator.java, WhoisSoap.java, WhoisSoap12Stub.java, 和 WhoisSoapStub.java。
    3. 客戶端程式: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"));
        }
      }
        
  2. 範例二:StockQuote 該服務提供 GetQuote(),而該 operation 需要一個代表股票名稱的 字串,例如 GOOG, IBM 等。
    1. 利用 WSDL2Java 來產生必要的 proxy 類別:
        wsdl.bat http://www.webservicex.net/stockquote.asmx?WSDL
        
    2. 產生的 proxy 類別被置放於 net\webserviceX\www,共有 StockQuote.java, StockQuote.java, StockQuoteSoap.java, 和 StockQuoteSoapStub.java。
    3. 客戶端程式: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 類別的時候, proxy 類別被置放於 net\webserviceX\www,可是 proxy 類別內的 import 卻是使用 NET.webserviceX.www,所以我們必須手動將目錄 net 更名為 NET,並且 client 程式也要 import NET.webserviceX.www.*;
  3. 範例三:CDYNE Weather 是個蠻複雜的服務,請仔細看一下它的 WSDL,你會發現它包含回傳物件、 物件陣列,而且也包含了日期物件。
    1. 利用 WSDL2Java 來產生必要的 proxy 類別:
        wsdl.bat http://ws.cdyne.com/WeatherWS/Weather.asmx?wsdl
        
    2. 產生的 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
    3. 客戶端程式: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());
          }
        }
      }
        
    4. 客戶端程式: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());
          }
        }
      }
        



Written by: 國立中興大學資管系呂瑞麟



沒有留言:

張貼留言