Aller au contenu

Récupérer les données retournées par net.HTTPClient()


OJC

Recommended Posts

Bonjour,

 

Je rencontre un souci lié à l'asynchronicité de net.HTTPClient(). Comment faire patienter le script le temps que les données arrivent, sachant que j'ai besoin de les faire 'sortir' (donc le traitement ne peut pas de faire à l'intérieur de net.HTTPClient()) ?

 

En gros, avoir le même résultat que dans un VD avec Net.FHttp() : j'appelle une fonction qui fait un socket:request() et qui me retourne response.

 

J'ai essayé (sans grande conviction) avec un fibaro:sleep(), mais bien sûr ça ne marche pas... <_<

 

Auriez-vous une idée ?

Lien vers le commentaire
Partager sur d’autres sites

Au final, j'ai fait comme ça, même si ce n'est pas totalement satisfaisant :

 

getdata=function(f,u)
  local socket=net.HTTPClient()
  socket:request(u,{success=function(r)f(r)end,error=function(r)f(r)end,options={method='GET'}})
  socket=nil
end

catch=function(r)
  if not r then
    getdata(catch,'http://x.x.x.x:xxxx/action')
  else
    print('response = ',x)
  end
end

catch()

 

Si les pros du lua ont une meilleure idée ??

Lien vers le commentaire
Partager sur d’autres sites

Je ne peux malheureusement pas t'aider mais ceci fonctionne ... par contre pas sur la HC2 mais cela peut te donner une piste.

 

            local r, c, h, s = http.request{
                  url = "http://"..hc2_ip.."/api/"..urlapi,
                  sink = ltn12.sink.table(resp),
                  method = "GET",
                  headers = {
                    ['Authorization'] = "Basic " .. (mime.b64(hc2_user..":"..hc2_pwd)),
                  }
            }
            print(resp[1])
            return json.decode(resp[1])

 

Lien vers le commentaire
Partager sur d’autres sites

@OJC, pas de "await" disponible a ma connaissance. j'avais codé ceci à l'époque dans les plugins pour contrôler mes traitements asynchrones ...

 

--! async object
async={}

--! wait function
--@ param condition The condition
--@ param callback  The callback
--@ param milliseconds (optional) The number of milliseconds to wait before executing the code
--@ return An integer with the ID value of the timer that is set. Use this value with the clearTimeout() method to cancel the timer.
function async:wait(condition, callback, milliseconds)
  assert(type(condition)=='function', 'wait(condition*, fn, milliseconds) condition should be a function')
  assert(type(fn)=='function', 'wait(condition, fn*, milliseconds) fn should be a function')
  if (condition()) then
    if (callback and type(callback)=='function') then
      callback()
      return 0
    end
    return
  else
    return setTimeout(function()
        self:wait(condition, callback)
      end, tonumber(milliseconds or 250))    
  end
end

Pour l'utilisation par exemple...

 

self:connectApi()
async:wait((function(...) return (self.isConnected==true) end), 
  function()
    self:onConnected()
    self:getData()
  end)

 

 

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

@Krikroff Au final, j'ai l'impression que ton morceau de code fait double emploi avec net.HTTPClient puisque la fonction request() permet déjà de déclencher l'exécution d'une ou deux fonctions (success et error). Je pense que vouloir supprimer l'asynchronicité d'une librairie qui est spécifiquement conçue pour l'être n'est tout simplement pas possible...

Lien vers le commentaire
Partager sur d’autres sites

L'idée c'est plutôt de synchroniser des actions asynchrones et pas de supprimer l'asynchronicité ;)

Alors d'une certaine manière oui c'est redondant avec net.HTTPClient mais le code risque de devenir très vite illisible est difficilement maintenable dans le cas de scénarios complexes.

Lien vers le commentaire
Partager sur d’autres sites

Oui :(

Mais ce que je suis en train de faire, c'est un objet pour faciliter l'utilisation de node-sonos-http-api, ce qui signifie que ce n'est pas l'objet lui-même qui est censé traiter le retour mais l'utilisateur final. Donc, du coup, j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur.

 

PS @Yohan : Au fait, avant il était possible dans un post de changer la police, ce qui était bien pratique... Pourquoi l'option a-t-elle été supprimée ?

Lien vers le commentaire
Partager sur d’autres sites

il y a 9 minutes, OJC a dit :

j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur

C'est ce que je fais aussi, c'est un peu lourd, mais ça fonctionne....

Lien vers le commentaire
Partager sur d’autres sites

Le 09/01/2018 à 11:53, OJC a dit :

Oui :(

Mais ce que je suis en train de faire, c'est un objet pour faciliter l'utilisation de node-sonos-http-api, ce qui signifie que ce n'est pas l'objet lui-même qui est censé traiter le retour mais l'utilisateur final. Donc, du coup, j'ai retenu le principe de passer en paramètre la fonction devant être exécutée lorsque request() a reçu la réponse du serveur.

 

PS @Yohan : Au fait, avant il était possible dans un post de changer la police, ce qui était bien pratique... Pourquoi l'option a-t-elle été supprimée ?

Salut @OJC, l'option est de nouveau disponible. ;)

  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...