Aller au contenu
Bloug

Aide Lua / Json

Recommended Posts

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 :)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

 

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'

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Problème réglé, Erreur avec un caractère dans l'url.

Merci .

 

Partager ce message


Lien à poster
Partager sur d’autres sites

×