Aller au contenu

Aide Lua / Json


Messages recommandés

Posté(e)

Je souhaite lancer la commande BOOST de mon sèche serviette.

j'y arrive Via API TESTER ....mais une fois en lua j'ai une Erreur 400 ...

 

Voila la fonction :

 

 function boost()
    print("> Start Boost...")
    local JSESSIONVG = fibaro:getGlobalValue("JSESSIONID")
    local httpClient = net.HTTPClient()
    httpClient:request(
        url .. url_send,
        {
            success = function(response)
                if
                    (tonumber(response.status) == 200 or tonumber(response.status) == 201 or
                        tonumber(response.status) == 202)
                 then
                    print("    > Commande Boost OK")
                else
                    print("    > Connexion KO !")
                    fibaro:debug("Error : " .. response.status)
                    print("Error : " .. response.data)
                end
            end,
            error = function(err)
                print("    > error = " .. err)
            end,
            options = {
                method = "POST",
                headers = {
                    ["content-type"] = "application/json",
                    ["cache-control"] = "no-cache",
                    ["Cookie"] = JSESSIONVG
                },
                data = body2
            }
        }
    )
end

 

et donc dans ma variable body2 qui je pense foire..... :

local body2 = '{"actions":[{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands": [{ "name": "setTowelDryerTemporaryState", "parameters": ["boost"]}]}]}},{"actions":[{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands": [{ "name": "setTowelDryerBoostModeDuration", "parameters": [10]}]}]}}'

 

dans Api Tester dans la case  POST DATA j'ai :

 

{"actions":[{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands": [{ "name": "setTowelDryerTemporaryState", "parameters": ["boost"]}]}]}},{"actions":[{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands": [{ "name": "setTowelDryerBoostModeDuration", "parameters": [10]}]}]}}

merci :)

 

Posté(e)

Le JSON de ta variable body2 est mal formé (Notepad++ refuse de le décoder... donc ton sèche-serviette aussi)

 

Je n'ai pas cherché plus loin, je te laisse décomposer les accolades et parenthèses, tu vas trouver facilement je pense.

Posté(e)

 

j'ai en premier simplifié pour n'envoyer qu'une seule commande, et enlevé les parenthèses et accolades en trop (je pense).

 

J'ai testé le json sur jsonformatter.curiousconcept qui me le donne comme correct :

 

{"actions":{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands":{ "name": "setTowelDryerTemporaryState", "parameters":"boost"}}}

mais j'ai toujours l'erreur 400 dans la hc2 :

body2 = '{"actions":{"deviceURL": "io://0810-4343-0200/13610533#1" ,"commands":{ "name": "setTowelDryerTemporaryState", "parameters":"boost"}}}'

 

Dans la variable body2 doit il y avoir un texte en json ou une table lua ?

 

body2 = {
    actions = {
        deviceURL = "io://0810-4343-0200/13610533#1",
        commands = {
            name = "setTowelDryerTemporaryState",
            parameters = "boost"
        }
    }
}

car après avoir testé j'ai l'erreur : [ fatal] LUA error: std::exception: 'unable to make cast'

Posté(e)

Si tu regardes sur mon tuto :

 

 

=> C'est bien une string qu'il faut envoyer dans la variable data de la requête http

 

Le JSON encodé dans ta variable body2 semble maintenant conforme (en tout cas Notepadd++ la décode proprement), mais peut être que ton sèche serviette n'aime pas les espaces dedans (le code http 400 c'est "bad request", donc tu lui envoies une requête qu'il n'aime pas)

Si tu veux être certain d'avoir un JSON correctement formaté, le mieux est encore... de ne pas le faire à la main !

Donc tu prend ta variable de type table, et tu l'encode avec json.encode avant de la mettre dans data

Un truc du style :

 

local body2 = {
    actions = {
        deviceURL = "io://0810-4343-0200/13610533#1",
        commands = {
            name = "setTowelDryerTemporaryState",
            parameters = "boost"
        }
    }
}

...

data = json.encode(body2)

 

×
×
  • Créer...