Aller au contenu

Messages recommandés

Posté(e)

@pepite  effectivement si je rajoute le fibaro:debug(json.encode(response)) voila ce que j'obtiens

 

image.png.d232bbdbf1e3427b664ff8c581681317.png

 

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 ??

Posté(e) (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é par pepite
Posté(e)

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...  

Posté(e)

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

Posté(e)

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

Posté(e)

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

  • Like 1
Posté(e)
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 ;-)

Posté(e)

@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+)\""))

 

  • Upvote 2
Posté(e)

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

 

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)

  • Like 1
Posté(e) (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é par OJC
Posté(e)

@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

 

 

5a0ec0f7d9adb_Greenshot2017-11-1711_58_30.thumb.png.988cbde92457ffa7dbe36cd93113f608.png

Posté(e) (modifié)

Oué, regarde deux posts plus haut la formule modifiée tenant compte du fait que tu as des signes = dans son token.

Modifié par OJC
Posté(e)

@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...

 

Posté(e)

@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,

 

Posté(e)
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

Posté(e) (modifié)

@Steven Le souci, c'est qu'il y a un caractère d'échappement dans son token :  i2xU0kot0ZONeg\/tgGcTA== donc ça foire :mellow:

Modifié par OJC
Posté(e)

Tada :D :

 

local key = "token"
local token = response:match("\""..key.."\":\"(.+)\",")
print(token)

 

  • Like 1
  • Upvote 1
Posté(e) (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é par pepite
Posté(e)

@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...5a0ed53de0ade_Greenshot2017-11-1713_25_02.thumb.png.52dee9b563ca7e164aed425bd78da537.png

 

 

Posté(e)

@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 ?

×
×
  • Créer...