In diesem Beispiel wird gezeigt, wie eine Anwendung für einen mobilen Webdienst erstellt wird. Die Anwendung, deren Erstellung einige Minuten dauert, verwendet die QAnywhere Store-and-Forward-Technologie, sodass Sie eine Anforderung eines Wetterberichts auch offline stellen können. Wenn der Bericht verfügbar ist, wird er angezeigt.
Der folgende Code beschreibt einen Webdienst namens Global Weather. (Es handelt sich um eine WSDL-Datei, die von einem öffentlichen Wetter-Webdienst kopiert wurde.) Kopieren Sie den Code in eine Datei und nennen Sie die Datei 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> |
Um eine mobile Anwendung zu erstellen, mit der auf den Webdienst Global Weather zugegriffen wird, führen Sie zunächst den QAnywhere WSDL-Compiler aus. Er generiert eine Proxyklasse, die in einer Anwendung benutzt werden kann, damit Anfragen an den Global Wheather-Webdienst abgesetzt werden können. In diesem Beispiel ist die Anwendung in Java geschrieben.
wsdlc -l java globalweather.wsdl |
Dieser Befehl generiert eine Proxyklasse namens GlobalWeatherSoap.java im Unterverzeichnis NET\webserviceX des aktuellen Verzeichnisses. Diese Proxyklasse ist die Dienstbindungsklasse für Ihre Anwendung. Nachstehend wird der Inhalt von GlobalWeatherSoap.java angezeigt:
/* * 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 ); } } } |
Danach schreiben Sie Anwendungen, die die Dienstbindungsklasse verwenden, um Abfragen an den Webdienst durchzuführen und die Ergebnisse zu verarbeiten. Nachstehend werden zwei Anwendungen gezeigt, die Webdienstanforderungen offline durchführen und die Ergebnisse verarbeiten, wenn eine Verbindung verfügbar ist.
Die erste Anwendung, RequestWeather, ruft im Global Weather-Dienst Daten ab und zeigt die ID der Anforderung. Kopieren Sie den folgenden Code in die Datei 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() ); } } } |
Die zweite Anwendung, ShowWeather, zeigt die Wetterbedingungen für eine gegebene Anforderungs-ID. Kopieren Sie den folgenden Code in die Datei 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() ); } } } |
Kompilieren Sie die Anwendung und die Dienstbindungsklasse:
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 |
Ihre Anwendung für einen mobilen Webdienst erfordert einen Client-Nachrichtenspeicher auf jedem mobilen Gerät. Außerdem benötigt sie einen Server-Nachrichtenspeicher. In diesem Beispiel wird allerdings der Beispiel-Servernachrichtenspeicher von QAnywhere verwendet.
Um einen Client-Nachrichtenspeicher zu erstellen, richten Sie eine SQL Anywhere-Datenbank mit dem dbinit-Dienstprogramm ein und führen den QAnywhere Agent aus, um sie als Client-Nachrichtenspeicher einzurichten:
dbinit -i qanywhere.db qaagent -q -si -c "dbf=qanywhere.db" |
Starten Sie den QAnywhere Agent, um eine Verbindung mit dem Client-Nachrichtenspeicher aufzunehmen:
qaagent -c "dbf=qanywhere.db;eng=qanywhere;uid=ml_qa_user;pwd=qanywhere" |
Starten Sie den QAnywhere-Server:
mlsrv11 -m -zu+ -c "dsn=QAnywhere 11 Demo;uid=ml_server;pwd=sql;start=dbsrv11" -v+ -ot qanyserv.mls |
Erstellen Sie einen Webdienstkonnektor, der auf QAnywhere-Nachrichten wartet, die an den GetWeather-Webdienst gesendet werden, Webdienstaufrufe durchführt, wenn die Nachrichten ankommen, und Antworten an den aufrufenden Client zurücksendet.
Öffnen Sie Sybase Central und klicken Sie auf Verbindungen » Verbinden mit QAnywhere 11.
Im Feld Benutzer-ID geben Sie ml_server ein.
Im Feld Kennwort geben Sie sql ein.
Klicken Sie auf ODBC-Datenquellenname und navigieren Sie zum Speicherort der QAnywhere 11 Demo.
Klicken Sie auf OK.
Wählen Sie Datei » Neu » Konnektor.
Klicken Sie auf Webdienste. Klicken Sie auf Weiter.
In das Feld Konnektorname geben Sie ianywhere.connector.globalweather ein. Klicken Sie auf Weiter.
In das Feld URL geben Sie http://www.webservicex.net/globalweather.asmx ein. Klicken Sie auf Fertig stellen.
Um eine Wetterbericht-Anforderung an den Webdienst in die Warteschlange aufzunehmen, geben Sie Folgendes ein:
java -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" RequestWeather |
Eine Anforderungs-ID wird zurückgegeben.
Um den Wetterbericht anzuzeigen, geben Sie Folgendes ein: Das Ende sollte die Anforderungs-ID sein. In diesem Beispiel ist sie REQ123123123.
java -classpath ".;%sqlany11%\java\iawsrt.jar;%sqlany11%\java\qaclient.jar" ShowWeather REQ123123123 |
Ein detaillierter Wetterbericht wird zurückgegeben.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |