2016-05-18 1 views
2

J'essaie de trouver la meilleure façon de récupérer le contenu d'une requête http GET en utilisant un délai d'expiration. J'ai passé beaucoup de temps à essayer de trouver la meilleure approche, mais je suis un peu incertain.Récupération de la réponse http en utilisant spray et futures avec timeout

Fondamentalement, je veux juste avoir une option qui retournera None si la réponse ne vient pas avant le délai, sinon retourner le contenu.

Merci

+0

Utilisez-vous le client http spray? –

+0

Oui, j'utilise Spray – tigga4392

Répondre

0

Vous pouvez essayer quelque chose comme ceci:

timedOutFuture = after(duration = duration, using = system.scheduler) { 
    Future.successfull(None) 
} 

Future.firstCompletedOf(Seq(youHttpRequestFuture, timedOutFuture)) 

Hope it helps

1

donc je suppose que vous essayez de résoudre 2 problèmes. Comment définir un délai d'expiration particulier dans la configuration, puis comment gérer les délais d'attente lorsqu'ils se produisent.

  • Définir les délais d'attente des clients http: Vous devez mettre à jour votre application.conf pour remplacer le default configuration of the http client. .: par exemple

    spray.can { 
        client { 
        request-timeout = 20s 
        } 
    } 
    

  • Gestion délais d'attente: Lorsque vous utilisez le spray client, vous utiliserez un pipeline qui exécutera les demandes. Ce sera une fonction qui ressemble à (HttpRequest) => Future[ObjectResponse]. Le résultat sera un Future d'un objet que vous avez défini, ObjectResponse dans mon exemple, vous pouvez résoudre le futur. Dans le cas où il y a un délai d'attente, le Future deviendra un RequestTimeoutException. Ensuite, vous serez en mesure de traiter l'exception de délai d'expiration avec un recover. Donc, votre code ressemblera à ceci:

    def sendRequestFunction(...): Future[ObjectResponse] = {...} 
    
    sendRequestFunction(parameters) map (Option) // In case we get an object, we will have a Some(obj) 
    recover { 
        case e: RequestTimeoutException => None 
    }