Partage
  • Partager sur Facebook
  • Partager sur Twitter

Async HTTP Request

Sujet résolu
    4 juin 2024 à 10:22:04

    Bonjour à tous ! 

    Merci d'avance pour votre lecture et du temps que vous prendrez à lire mon post ou bien à y répondre :)

    Je dois faire des requêtes REST de type POST en général à un serveur distant. (Jusqu'ici tout va bien).

    Cependant mon serveur est un serveur assez lent (dû aux technologies derrières). Et peut mettre jusqu'à plusieurs minutes à répondre.

    J'aimerais que mon code métier puisse envoyer des requêtes POST vers le serveur sans attendre le retour du serveur. (En autre faire un code non bloquant) mais qui lancerait des coroutines (je ne sais pas si c'est ce que je dois faire) qui serait en attente du retour du serveur.

    Petit ++ : Le code serait appelé depuis PyTest et passerait le test en succès si la réponse est bien celle attendue.

    Comment pourrais je faire ça ?  Voici une ébauche de code ... (Qui est sensé répondre un flottant : à l'issue ;) ) (Contenue de ma réponse à ma requête POST)

        async def GetLux(self):
            frame = (self.transportChannel
                       .getRequestMessageBuilder()
                       .GetLux()
                       .Build()
                    )
            self.transportChannel.sendFrame(message=frame)
            # Debug purpose : ASYNC Message : Blocking API. Can use ASYNCIO instead ? 
            print(self.transportChannel.GetAwaitedMsgList())
    
            expectedBlock = (self.transportChannel
                       .getResponseMessageBuilder()
                       .GetLux()
                       .Build()
                    )
            return self.transportChannel.receiveFrame()


    J'appel ce code depuis PyTest de cette façon: 

    @pytest.mark.Basics
    def testGetLux(DUT):
        """
        Get Lux value from OTA
        """
        lux = DUT.GetLux()
        print(f"Lux value is {lux} lux")
        assert lux != 0.0

    Merci d'avance pour votre aide !

    Kasimashi.

    -
    Edité par Kasimashi 4 juin 2024 à 10:29:28

    • Partager sur Facebook
    • Partager sur Twitter
      6 juin 2024 à 8:24:00

      Bonjour,

      Si je peux donner un conseil, c'est de simplifier tes tests unitaires avec pytest en utilisant pytest-asyncio.

      Dans votre fonction, vous devez appeler toutes vos actions sensées être bloquantes à l'aide du mot clé await.

      -
      Edité par fred1599 6 juin 2024 à 8:24:23

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        7 juin 2024 à 17:25:05

        Bonjour Merci @fred1599, pour la réponse.

        C'est aussi ce que j'avais songer à utiliser mais j'avoue que je ne sais pas au final si c'est une bonne idée tout cela ... 

        Ce que je comprend de l'asynchrone c'est que je peux envoyer une donnée et en attendant la réponse, j'en envoie une seconde, puis une troisième, une quatrième, etc ... J'ai peur que cela créer des effets de bords. 

        Je vais éviter l'asynchrone pour le moment mais ce n'est pas impossible que je revienne sur le sujet. 

        Merci ! 

        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2024 à 18:19:01

          Effectivement l'asynchronisme, c'est faire un meilleur usage des temps d'attente, mais je vois pas les effets de bord possibles, généralement ces temps d'attente correspondent à des réponses aux requêtes réseau.

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          Async HTTP Request

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown