Cardane Posté(e) le 16 novembre 2017 Auteur Signaler Posté(e) le 16 novembre 2017 @pepite effectivement si je rajoute le fibaro:debug(json.encode(response)) voila ce que j'obtiens et on retrouve bien la suite de caractères juste après "data".... reste plus qu'à trouver comment passer outre... je suppose que c'est à ca que servent les deux commandes tail -n +2 et jq -r dans l'exemple du shell, puisque tail - n +2 va prendre ce qui suit la deuxième ligne, donc ce qui suit le "\n" mais bon, c'est quoi l'équivalent en lua ??
pepite Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 (modifié) Salut @Cardane, Ben voila, c'est mieux ;-) PS : En fait on voit bien dans le headers le "Connection" Donc le fibaro:debug(json.encode(response.data)) est correct, la reponse est bien la fermeture des caracteres. Ton fibaro:debug(jsonTable.token) renvoie bien la ligne avec le token. C'est bizarre, mais je tenterais bien jsonTable.token.token pour le recuperer. L'erreur fatale lua parle du caractere @ .. Pour voir le formatage du json, as tu essaye de joindre l'api depuis un navigateur ? Modifié le 17 novembre 2017 par pepite
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 Salut @pepite je viens d'essayer ta solution, ca ne marche pas. En fait je reste persuadé que c'est le retour à la ligne qui pose problème. Si je regarde l'exemple en shell ci-dessus, il utilise bien le "tail -n +2" pour prendre la deuxième ligne (donc après le \n) Il n'y a pas une fonction quelque part qui pourrait me transformer tout ca en string .... ensuite je me débrouille pour manipuler la string...
pepite Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 Re @Cardane. Dommage cela aurait été trop facile Alors pour les string et les patterns, c'est ma bete noire ;-) , string.... https://www.lua.org/manual/5.3/manual.html#6.4 MAis tu as raison, un petit tostring sur un response.xxxxx puis un string.find ou match, puis un gsub (ou pas)..et hop Pour ca, je fais appel à DES amis, pas le choix, pourtant j'adore les strings...(je devais la faire..) mais je galere...rajoute au pattern... @Lazer, @Steven, @MAM78, @OJC, @jojo J'en oublie c'est sur ;-)
jojo Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 Pour les strings je peux t'expliquer comment les utiliser (retirer), mais je n'ai aucune expérience avec les patterns Envoyé de mon Nexus 5 en utilisant Tapatalk
Steven Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 De manière très simpliste. Si on prend un retour en json : local response = json.encode({token="ABCDEFG", result=true, deviceStatus="IDLE", data={}}) Et qu'on veux chercher simplement la valeur (un string) d'un élément, il suffit de faire ainsi : local key = "token" print(response:match("\""..key.."\":.(%w+).")) Il ne faut pas d'espace dans la valeur mais pour un token, il n'y en a jamais :-) 1
pepite Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 il y a 7 minutes, Steven a dit : il suffit de faire ainsi hihi oui oui mais c'est bien sûr ;-) bon j'ai presque compris : \ pour echapper les " et les garder %w : tout ce qui est alphanumerique + : pour la repetition les parentheses autour de %w+ : pour la capture Si déjà j'ai "bon" sur ce que je viens de dire suis heureux lol MAIS je ne comprends pas les . devant et après (%w+) HELP ;-)) @Cardane : voila voila ;-) reste plus qu'a trouvert l'origine de cette erreur lua dans ta copie d'ecran ;-)
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 @pepite dans l'exemple de @Steven, la valeur de response est : {"token":"ABCDEFG","result":"true","deviceStatus":"IDLE","data":{}} Donc, les points, c'est pour dégager les guillemets autour de ABCDEFG. Dans un pattern, ça désigne n'importe quel caractère. C'est la même chose que : local key = "token" print(response:match("\""..key.."\":\"(%w+)\"")) 2
Steven Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 En effet. C'est vraiment un pattern des plus basique juste pour répondre à la question qui est de récupéré le token ... mais comme je viens de voir qu'il y a des "==" dans le token, cela ne fonctionne pas Voici donc une autre proposition : print(response:match("\""..key.."\":\"([A-Za-z0-9|=%.%+%s]+)\"")) Soit tout les caractères entre A et Z (A-Z), entre a et z (a-z), entre 0 et 9 (0-9), le pipe (|), le égale (=) , le point (.), le (+) et l'espace (%s) 1
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 (modifié) Sinon pour exploiter sous format de variable table, essaie de faire une boucle pour voir ce qui sort : success = function(response) print ("Je suis dans response") local jsonTable = json.decode(response.data) for i, j in pairs(jsonTable) do fibaro:debug(tostring(i) .. " - " .. tostring(j)) end end, Modifié le 17 novembre 2017 par OJC
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 @pepite @Steven @OJC bon, soit j'ai encore loupé un truc mais j'essaie avec le code de @Steven et ca ne marche pas... voilà le code klf:request(url , { success = function(response) print ("Je suis dans response") fibaro:debug(json.encode(response)) local temp = json.encode(response) fibaro:debug(temp) local key = "token" print(temp:match("\""..key.."\":.(%w+).")) end, et voilà le debug
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 (modifié) Oué, regarde deux posts plus haut la formule modifiée tenant compte du fait que tu as des signes = dans son token. Modifié le 17 novembre 2017 par OJC
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 @OJC ton test en passant par la table ne marche pas, il génère une erreur LUA, je suppose une fois de plus à cause de la présence du "\n" dans le response...
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 @Cardane oui, bien possible. Essaie comme ça du coup : success = function(response) print ("Je suis dans response") response.data = string.gsub(response.data, ")]},\n", "") local jsonTable = json.decode(response.data) for i, j in pairs(jsonTable) do fibaro:debug(tostring(i) .. " - " .. tostring(j)) end end,
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 ben non, même avec la deuxième proposition de steven la retour est toujours "nil"
Steven Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 local response = "\"status\":200\n{\"token\":\"ABCD|E FG==\",\"result\"=true, data={}}" local key = "token" local token = response:match("\""..key.."\":\"(([A-Za-z0-9|=%.%+%s]+))\"") print(token) EDIT : Oublie il y a aussi des / dans ton token
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 (modifié) @Steven Le souci, c'est qu'il y a un caractère d'échappement dans son token : i2xU0kot0ZONeg\/tgGcTA== donc ça foire Modifié le 17 novembre 2017 par OJC
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 Tada : local key = "token" local token = response:match("\""..key.."\":\"(.+)\",") print(token) 1 1
pepite Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 (modifié) Et ben ce n'est pas moi qui allait trouver cela ;-) ou alors après 32 demandes et dans 6 mois lol Franchement, les pattern ne m'aiment pas..j'ai beau lire relire, quand ca veut pas ;-) Donc révision pattern : le . pour degager ? ;-) Modifié le 17 novembre 2017 par pepite
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 @OJC@Steven toujours le même résultat "nil" en fait le token change à chaque fois, donc il n'y a pas toujours les caractères d'échappement voici le dernier test local url = 'http://'.. ip .. '/api/v1/auth' local datas = '{"action":"login","params":{"password":"velux123"}}' local klf = net.HTTPClient() klf:request(url , { success = function(response) fibaro:debug(json.encode(response)) local temp = json.encode(response) fibaro:debug(temp) local key = "token" print(temp:match("\""..key.."\":\"(.+)\",")) end, et le résultat...
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 @Cardane Tu peux faire un copie coller du debug (pour faciliter les tests) stp ?
OJC Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 Et essaie en remplaçant print par fibaro:debug
Cardane Posté(e) le 17 novembre 2017 Auteur Signaler Posté(e) le 17 novembre 2017 @OJC le fibaro:debug n'arrange rien, je viens d'essayer... tu veux dire quoi avec le copier / coller du debug ? je viens de le mettre deux posts plus haut , ce n'est pas ca que tu veux ?
pepite Posté(e) le 17 novembre 2017 Signaler Posté(e) le 17 novembre 2017 il y a 1 minute, OJC a dit : fibaro:debug print va fonctionner dans la scene ;-)
Messages recommandés