Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » QAnywhere » Mobile Webdienste » Webdienstanforderungen durchführen

 

Asynchrone Webdienstanforderungen

Asynchrone Webdienstanforderungen sind sinnvoll, wenn die Anwendung für mobile Webdienste nur gelegentlich mit einem Netzwerk verbunden ist. Bei dieser Methode erfolgt eine Webdienstanforderung durch den Aufruf einer Methode in der Dienstbindungsklasse, um die Anforderung in eine ausgehende Warteschlange zu stellen. Die Methode gibt ein WSResult zurück, das benutzt werden kann, um den Status der Antwort zu einem späteren Zeitpunkt abzurufen, auch nachdem die Anwendung neu gestartet wurde.

Im folgenden Beispiel wird die asynchrone Anforderung nach dem Wechselkurs von USD in CAD abgeschickt:

// C#
WSResult r = service.AsyncConversionRate( Currency.USD, Currency.CAD );
  
// Get the request ID.  Save it for later use if necessary.
string reqID = r.GetRequestID();

// Later: get the response for the specified request ID
WSResult r = service.GetResult( reqID );
if( r.GetStatus() == WSStatus.STATUS_RESULT_AVAILABLE ) {
  Console.WriteLine( "The conversion rate is " + r.GetDoubleValue( "ConversionRateResult" ) );
} else {
  Console.WriteLine( "Response not available" );
} 
// Java
WSResult r = service.asyncConversionRate( NET.webserviceX.Currency.USD, NET.webserviceX.Currency.CAD );
     
// Get the request ID.  Save it for later use if necessary.
String reqID = r.getRequestID();

// Later: get the response for the specified request ID
WSResult r = service.getResult( reqID );
if( r.getStatus() == WSStatus.STATUS_RESULT_AVAILABLE ) {
    System.out.println( "The conversion rate is " + r.getDoubleValue( "ConversionRateResult" ) );
} else {
    System.out.println( "Response not available" );
}

Sie können auch einen WSListener verwenden, um einen asynchronen Callback zu erhalten, wenn die Antwort auf eine Webdienstanforderung verfügbar ist. Zum Beispiel:

// C#
// Make a request to get the USD to CAD exchange rate
WSResult r = service.AsyncConversionRate( Currency.USD, Currency.CAD );
  
// Register a listener for the result
service.SetListener( r.GetRequestID(), new CurrencyConvertorListener() );

// Java
// Make a request to get the USD to CAD exchange rate
WSResult r = service.asyncConversionRate( NET.webserviceX.Currency.USD, NET.webserviceX.Currency.CAD );
     
// Register a listener for the result
service.setListener( r.getRequestID(), new CurrencyConvertorListener() );

Die WSListener-Schnittstelle definiert zwei Methoden für die Verarbeitung von asynchronen Ereignissen:

  • OnResult   Eine OnResult-Methode wird implementiert, um eine Antwort an eine Webdienstanforderung abzuwickeln. Sie erhält ein WSResult-Objekt, das das Ergebnis der Webdienstanforderung darstellt.

  • OnException   Eine OnException-Methode wird implementiert, um Fehler zu verarbeiten, die während der Verarbeitung der Antwort auf die Webdienstanforderung auftreten können. Ihr wird ein WSException-Objekt und ein WSResult-Objekt übergeben. Das WSException-Objekt enthält Informationen über den aufgetretenen Fehler und das WSResult-Objekt kann verwendet werden, um die Anforderungs-ID zu erhalten, zu der die Antwort gehört.

// C#
class CurrencyConvertorListener : WSListener
{
   public CurrencyConvertorListener() {
   }

   public void OnResult( WSResult r ) {
    try {
         USDToCAD._statusMessage = "USD to CAD currency exchange rate: " + r.GetDoubleValue( "ConversionRateResult" );
    } catch( Exception exc ) {
        USDToCAD._statusMessage = "Request " + r.GetRequestID() + " failed: " + exc.Message;
    }
   }

   public void OnException( WSException exc, WSResult r ) {
    USDToCAD._statusMessage = "Request " + r.GetRequestID() + " failed: " + exc.Message;
   }
} 
// Java
private class CurrencyConvertorListener implements WSListener
{
  public CurrencyConvertorListener() {
  }
 
  public void onResult( WSResult r ) {
   try {
        USDToCAD._statusMessage = "USD to CAD currency exchange rate: " + r.getDoubleValue( "ConversionRateResult" );
   } catch( Exception exc ) {
        USDToCAD._statusMessage = "Request " + r.getRequestID() + " failed: " + exc.getMessage();
   }
   }

   public void onException( WSException exc, WSResult r ) {
        USDToCAD._statusMessage = "Request " + r.getRequestID() + " failed: " + exc.getMessage();
   }
}