この例では、モバイル Web サービス・アプリケーションの作成方法を紹介します。数分で作成可能なこのアプリケーションでは、QAnywhere の蓄積転送機能を使用します。これにより、オフラインのときでも天気予報に対する要求を発行し、利用可能になったら天気予報を見ることができます。
次のコードは、Global Weather という Web サービスを記述したものです。公開されている天気予報 Web サービスからコピーした wsdl ファイルです。コードをファイルにコピーし、そのファイルに globalweather.wsdl という名前を付けます。
<?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.webserviceX.NET" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://www.webserviceX.NET" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.webserviceX.NET"> <s:element name="GetWeather"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="CityName" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetWeatherResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetWeatherResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetCitiesByCountry"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="CountryName" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetCitiesByCountryResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="GetCitiesByCountryResult" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="string" nillable="true" type="s:string" /> </s:schema> </wsdl:types> <wsdl:message name="GetWeatherSoapIn"> <wsdl:part name="parameters" element="tns:GetWeather" /> </wsdl:message> <wsdl:message name="GetWeatherSoapOut"> <wsdl:part name="parameters" element="tns:GetWeatherResponse" /> </wsdl:message> <wsdl:message name="GetCitiesByCountrySoapIn"> <wsdl:part name="parameters" element="tns:GetCitiesByCountry" /> </wsdl:message> <wsdl:message name="GetCitiesByCountrySoapOut"> <wsdl:part name="parameters" element="tns:GetCitiesByCountryResponse" /> </wsdl:message> <wsdl:message name="GetWeatherHttpGetIn"> <wsdl:part name="CityName" type="s:string" /> <wsdl:part name="CountryName" type="s:string" /> </wsdl:message> <wsdl:message name="GetWeatherHttpGetOut"> <wsdl:part name="Body" element="tns:string" /> </wsdl:message> <wsdl:message name="GetCitiesByCountryHttpGetIn"> <wsdl:part name="CountryName" type="s:string" /> </wsdl:message> <wsdl:message name="GetCitiesByCountryHttpGetOut"> <wsdl:part name="Body" element="tns:string" /> </wsdl:message> <wsdl:message name="GetWeatherHttpPostIn"> <wsdl:part name="CityName" type="s:string" /> <wsdl:part name="CountryName" type="s:string" /> </wsdl:message> <wsdl:message name="GetWeatherHttpPostOut"> <wsdl:part name="Body" element="tns:string" /> </wsdl:message> <wsdl:message name="GetCitiesByCountryHttpPostIn"> <wsdl:part name="CountryName" type="s:string" /> </wsdl:message> <wsdl:message name="GetCitiesByCountryHttpPostOut"> <wsdl:part name="Body" element="tns:string" /> </wsdl:message> <wsdl:portType name="GlobalWeatherSoap"> <wsdl:operation name="GetWeather"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation> <wsdl:input message="tns:GetWeatherSoapIn" /> <wsdl:output message="tns:GetWeatherSoapOut" /> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation> <wsdl:input message="tns:GetCitiesByCountrySoapIn" /> <wsdl:output message="tns:GetCitiesByCountrySoapOut" /> </wsdl:operation> </wsdl:portType> <wsdl:portType name="GlobalWeatherHttpGet"> <wsdl:operation name="GetWeather"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation> <wsdl:input message="tns:GetWeatherHttpGetIn" /> <wsdl:output message="tns:GetWeatherHttpGetOut" /> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation> <wsdl:input message="tns:GetCitiesByCountryHttpGetIn" /> <wsdl:output message="tns:GetCitiesByCountryHttpGetOut" /> </wsdl:operation> </wsdl:portType> <wsdl:portType name="GlobalWeatherHttpPost"> <wsdl:operation name="GetWeather"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get weather report for all major cities around the world.</documentation> <wsdl:input message="tns:GetWeatherHttpPostIn" /> <wsdl:output message="tns:GetWeatherHttpPostOut" /> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <documentation xmlns="http://schemas.xmlsoap.org/wsdl/">Get all major cities by country name(full / part).</documentation> <wsdl:input message="tns:GetCitiesByCountryHttpPostIn" /> <wsdl:output message="tns:GetCitiesByCountryHttpPostOut" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="GlobalWeatherSoap" type="tns:GlobalWeatherSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <wsdl:operation name="GetWeather"> <soap:operation soapAction="http://www.webserviceX.NET/GetWeather" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <soap:operation soapAction="http://www.webserviceX.NET/GetCitiesByCountry" style="document" /> <wsdl:input> <soap:body use="literal" /> </wsdl:input> <wsdl:output> <soap:body use="literal" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="GlobalWeatherHttpGet" type="tns:GlobalWeatherHttpGet"> <http:binding verb="GET" /> <wsdl:operation name="GetWeather"> <http:operation location="/GetWeather" /> <wsdl:input> <http:urlEncoded /> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <http:operation location="/GetCitiesByCountry" /> <wsdl:input> <http:urlEncoded /> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:binding name="GlobalWeatherHttpPost" type="tns:GlobalWeatherHttpPost"> <http:binding verb="POST" /> <wsdl:operation name="GetWeather"> <http:operation location="/GetWeather" /> <wsdl:input> <mime:content type="application/x-www-form-urlencoded" /> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body" /> </wsdl:output> </wsdl:operation> <wsdl:operation name="GetCitiesByCountry"> <http:operation location="/GetCitiesByCountry" /> <wsdl:input> <mime:content type="application/x-www-form-urlencoded" /> </wsdl:input> <wsdl:output> <mime:mimeXml part="Body" /> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="GlobalWeather"> <wsdl:port name="GlobalWeatherSoap" binding="tns:GlobalWeatherSoap"> <soap:address location="http://www.webservicex.net/globalweather.asmx" /> </wsdl:port> <wsdl:port name="GlobalWeatherHttpGet" binding="tns:GlobalWeatherHttpGet"> <http:address location="http://www.webservicex.net/globalweather.asmx" /> </wsdl:port> <wsdl:port name="GlobalWeatherHttpPost" binding="tns:GlobalWeatherHttpPost"> <http:address location="http://www.webservicex.net/globalweather.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions> |
Global Weather Web サービスにアクセスするモバイル アプリケーションを作成するには、まず、QAnywhere WSDL コンパイラを実行します。コンパイラにより、Global Weather Web サービスの要求を作成するためにアプリケーションで使用できるプロキシ・クラスが生成されます。この例では、アプリケーションは Java で記述されています。
wsdlc -l java globalweather.wsdl |
このコマンドは、プロキシ・クラス GlobalWeatherSoap.java を生成します。このプロキシ・クラスは、現在のディレクトリの NET\webserviceX サブディレクトリに格納されます。このプロキシ・クラスは、アプリケーション用のサービス・バインディング・クラスです。次に、GlobalWeatherSoap.java の内容を示します。
/* * GlobalWeatherSoap.java * * Generated by the iAnywhere WSDL Compiler Version 10.0.1.3415 * Do not edit this file. */ package NET.webserviceX; import ianywhere.qanywhere.ws.*; import ianywhere.qanywhere.client.QABinaryMessage; import ianywhere.qanywhere.client.QAException; import java.io.*; import javax.xml.transform.*; import javax.xml.transform.sax.*; import javax.xml.transform.stream.*; public class GlobalWeatherSoap extends ianywhere.qanywhere.ws.WSBase { public GlobalWeatherSoap(String iniFile) throws WSException { super(iniFile); init(); } public GlobalWeatherSoap() throws WSException { init(); } public void init() { setServiceName("GlobalWeather"); } public java.lang.String getWeather(java.lang.String cityName, java.lang.String countryName) throws QAException, WSException, WSFaultException { try { StringWriter sw = new StringWriter(); SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler hd = stf.newTransformerHandler(); QABinaryMessage qaRequestMsg = null; hd.setResult( new StreamResult( sw ) ); String responsePartName = "GetWeatherResult"; java.lang.String returnValue; writeSOAPHeader( hd, "GetWeather", "http://www.webserviceX.NET" ); WSBaseTypeSerializer.serialize(hd,"CityName",cityName,"string","http://www.w3.org/2001/XMLSchema",true,true); WSBaseTypeSerializer.serialize(hd,"CountryName",countryName,"string","http://www.w3.org/2001/XMLSchema",true,true); writeSOAPFooter( hd, "GetWeather" ); qaRequestMsg = createQAMessage( sw.toString(), "http://www.webserviceX.NET/GetWeather", "GetWeatherResponse" ); WSResult wsResult = invokeWait( qaRequestMsg ); returnValue = wsResult.getStringValue(responsePartName); return returnValue; } catch( TransformerConfigurationException e ) { throw new WSException( e ); } } public WSResult asyncGetWeather(java.lang.String cityName, java.lang.String countryName) throws QAException, WSException { try { StringWriter sw = new StringWriter(); SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler hd = stf.newTransformerHandler(); QABinaryMessage qaRequestMsg = null; hd.setResult( new StreamResult( sw ) ); writeSOAPHeader( hd, "GetWeather", "http://www.webserviceX.NET" ); WSBaseTypeSerializer.serialize(hd,"CityName",cityName,"string","http://www.w3.org/2001/XMLSchema",true,true); WSBaseTypeSerializer.serialize(hd,"CountryName",countryName,"string","http://www.w3.org/2001/XMLSchema",true,true); writeSOAPFooter( hd, "GetWeather" ); qaRequestMsg = createQAMessage( sw.toString(), "http://www.webserviceX.NET/GetWeather", "GetWeatherResponse" ); WSResult wsResult = invoke( qaRequestMsg ); return wsResult; } catch( TransformerConfigurationException e ) { throw new WSException( e ); } } public java.lang.String getCitiesByCountry(java.lang.String countryName) throws QAException, WSException, WSFaultException { try { StringWriter sw = new StringWriter(); SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler hd = stf.newTransformerHandler(); QABinaryMessage qaRequestMsg = null; hd.setResult( new StreamResult( sw ) ); String responsePartName = "GetCitiesByCountryResult"; java.lang.String returnValue; writeSOAPHeader( hd, "GetCitiesByCountry", "http://www.webserviceX.NET" ); WSBaseTypeSerializer.serialize(hd,"CountryName",countryName,"string","http://www.w3.org/2001/XMLSchema",true,true); writeSOAPFooter( hd, "GetCitiesByCountry" ); qaRequestMsg = createQAMessage( sw.toString(), "http://www.webserviceX.NET/GetCitiesByCountry", "GetCitiesByCountryResponse" ); WSResult wsResult = invokeWait( qaRequestMsg ); returnValue = wsResult.getStringValue(responsePartName); return returnValue; } catch( TransformerConfigurationException e ) { throw new WSException( e ); } } public WSResult asyncGetCitiesByCountry(java.lang.String countryName) throws QAException, WSException { try { StringWriter sw = new StringWriter(); SAXTransformerFactory stf = (SAXTransformerFactory) SAXTransformerFactory.newInstance(); TransformerHandler hd = stf.newTransformerHandler(); QABinaryMessage qaRequestMsg = null; hd.setResult( new StreamResult( sw ) ); writeSOAPHeader( hd, "GetCitiesByCountry", "http://www.webserviceX.NET" ); WSBaseTypeSerializer.serialize(hd,"CountryName",countryName,"string","http://www.w3.org/2001/XMLSchema",true,true); writeSOAPFooter( hd, "GetCitiesByCountry" ); qaRequestMsg = createQAMessage( sw.toString(), "http://www.webserviceX.NET/GetCitiesByCountry", "GetCitiesByCountryResponse" ); WSResult wsResult = invoke( qaRequestMsg ); return wsResult; } catch( TransformerConfigurationException e ) { throw new WSException( e ); } } } |
次に、Web サービス要求の作成や結果の処理にサービス・バインディング・クラスを使用するアプリケーションを記述します。次に、2 つのアプリケーションを示します。いずれも、オフラインの状態で Web サービス要求を作成し、接続が有効なときに結果を処理します。
最初のアプリケーションである RequestWeather は、Global Weather Web サービスの要求を作成し、その ID を表示します。RequestWeather.java ファイルに次のコードをコピーします。
import ianywhere.qanywhere.client.*; import ianywhere.qanywhere.ws.*; import com.myweather.GlobalWeatherSoap; class RequestWeather { public static void main( String [] args ) { try { // QAnywhere initialization QAManager mgr = QAManagerFactory.getInstance().createQAManager(); mgr.open( AcknowledgementMode.EXPLICIT_ACKNOWLEDGEMENT ); mgr.start(); // Instantiate the web service proxy GlobalWeatherSoap service = new GlobalWeatherSoap(); service.setQAManager( mgr ); service.setProperty( "WS_CONNECTOR_ADDRESS", "ianywhere.connector.globalweather\\" ); // Make a request to get weather for Beijing WSResult r = service.asyncGetWeather( "Beijing", "China" ); // Display the request ID so that it can be used by ShowWeather System.out.println( "Request ID: " + r.getRequestID() ); // QAnywhere finalization mgr.stop(); mgr.close(); } catch( Exception exc ) { System.out.println( exc.getMessage() ); } } } |
2 番目のアプリケーションである ShowWeather は、指定された要求 ID の気象情報を表示します。ShowWeather.java ファイルに次のコードをコピーします。
import ianywhere.qanywhere.client.*; import ianywhere.qanywhere.ws.*; import com.myweather.GlobalWeatherSoap; class ShowWeather { public static void main( String [] args ) { try { // QAnywhere initialization QAManager mgr = QAManagerFactory.getInstance().createQAManager(); mgr.open( AcknowledgementMode.EXPLICIT_ACKNOWLEDGEMENT ); mgr.start(); // Instantiate the web service proxy GlobalWeatherSoap service = new GlobalWeatherSoap(); service.setQAManager( mgr ); // Get the response for the specified request ID WSResult r = service.getResult( args[0] ); if( r.getStatus() == WSStatus.STATUS_RESULT_AVAILABLE ) { System.out.println( "The weather is " + r.getStringValue( "GetWeatherResult" ) ); r.acknowledge(); } else { System.out.println( "Response not available" ); } // QAnywhere finalization mgr.stop(); mgr.close(); } catch( Exception exc ) { System.out.println( exc.getMessage() ); } } } |
アプリケーションとサービス・バインディング・クラスをコンパイルします。
javac -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" com\myweather\GlobalWeatherSoap.java RequestWeather.java javac -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" com\myweather\GlobalWeatherSoap.java ShowWeather.java |
作成したモバイル Web サービス・アプリケーションは、各モバイル・デバイス上にクライアント・メッセージ・ストアを要求します。サーバ・メッセージ・ストアも必要ですが、この例では、QAnywhere のサンプルのサーバ・メッセージ・ストアを使用します。
クライアント・メッセージ・ストアを作成するには、dbinit ユーティリティを使用して SQL Anywhere データベースを作成し、QAnywhere Agent を実行してクライアント・メッセージ・ストアとして設定します。
dbinit -i qanywhere.db qaagent -q -si -c "dbf=qanywhere.db" |
QAnywhere Agent を起動し、クライアント・メッセージ・ストアに接続します。
qaagent -c "dbf=qanywhere.db;eng=qanywhere;uid=ml_qa_user;pwd=qanywhere" |
QAnywhere サーバを起動します。
mlsrv11 -m -zu+ -c "dsn=QAnywhere 11 Demo;uid=ml_server;pwd=sql;start=dbsrv11" -v+ -ot qanyserv.mls |
GetWeather Web サービスに送信される QAnywhere メッセージを受信し、メッセージが到着したときに Web サービス呼び出しを行い、応答を送信元のクライアントに送り返すための、Web サービス・コネクタを作成します。
Sybase Central で、[接続] - [QAnywhere 11 に接続] を選択します。
[ユーザ ID] フィールドに ml_server と入力します。
[パスワード] フィールドに sql と入力します。
[ODBC データ・ソース名] をクリックし、QAnywhere 11 Demo の場所を参照します。
[OK] をクリックします。
[ファイル] - [新規] - [コネクタ] を選択します。
[Web サービス] をクリックします。[次へ] をクリックします。
[コネクタ名] フィールドに ianywhere.connector.globalweather と入力します。[次へ] をクリックします。
[URL] フィールドに http://www.webservicex.net/globalweather.asmx と入力します。[完了] をクリックします。
Web サービスから天気予報を取得するための要求をキューに登録するには、次のように入力します。
java -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" RequestWeather |
要求 ID が返されます。
天気予報を見るには、次のように入力します。コマンドの末尾には要求 ID を入力します。この例では REQ123123123 となります。
java -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" ShowWeather REQ123123123 |
詳細な天気予報が返されます。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |