2017-06-03 4 views
1

J'effectue une requête à une API étrangère en utilisant luasec, lua-socket et en convertissant les données, une chaîne JSON, en une table lua avec cjson. J'ai lu les documents de ces modules et malheureusement, rien de tout cela m'a aidé avec mon problème. Impossible de lier plus de 2 sites Web avec le compte actuel, désolé.La chaîne JSON ne parvient pas à convertir en table Lua correcte

Résumé: J'obtiens la réponse et la chaîne appropriée en utilisant la fonction de requête affichée, quand je transforme cette chaîne en une table lua via cjson.decode, la table de sortie n'est pas celle désirée, c'est une copie de mon entête de réponse, ce qui n'est pas intentionnel.

Le code suivant est comment je fais ma demande:

local function request (req_t) 
    local res_t = {} 

    resp = https.request { 
    url = const.API_URL .. req_t.url, 
    method = req_t.method, 
    headers = req_t.headers, 
    sink = ltn12.sink.table(res_t) 
    } 

    return table.concat(res_t), resp.headers, resp.code 
end 

Utilisation de l'appel suivant

local res, headers = request({ ... }) 

Je reçois la réponse appropriée en tant que chaîne, mais mon but est de faire la manipulation de données avec elle afin de tourner à ladite réponse (string) pour une table de lua avec

local resJson = cjson.decode(res) 

-t pas produire la sortie correcte. Il produit une table qui est exactement le même que mon en-tête de réponse. Voici la sortie suivante de mon terminal à côté du code

When out of function type is: string 

Desired response in string: 
{"total_photos":221926,"photo_downloads":"186029632.0"} 

When out of function type is: string 

Desired response in string: 
{"total_photos":221926,"photo_downloads":"186029632.0"} 


After decode, type is: table 

server Cowboy 
strict-transport-security max-age=31536000 
access-control-allow-headers * 
x-ratelimit-limit 50 
x-ratelimit-remaining 46 
x-cache-hits 0, 0 
accept-ranges bytes 
access-control-request-method * 
x-request-id ee5a74fd-2b10-4f46-9c25-5cfc53aeac6c 
access-control-expose-headers Link,X-Total,X-Per-Page,X-RateLimit-Limit,X-RateLimit-Remaining 
content-type application/json 
connection close 
content-length 55 
fastly-debug-digest f62d52c08b1ef74db89a66a0069f0a35c49e52230567905240dacf08c9ea1813 
vary Origin 
cache-control no-cache, no-store, must-revalidate 
x-timer S1496524765.369880,VS0,VE111 
x-cache MISS, MISS 
x-served-by cache-iad2123-IAD, cache-mad9429-MAD 
via 1.1 vegur, 1.1 varnish, 1.1 varnish 
date Sat, 03 Jun 2017 21:19:25 GMT 
age 0 
access-control-allow-origin * 
x-runtime 0.011667 

Printing header 

server Cowboy 
strict-transport-security max-age=31536000 
access-control-allow-headers * 
x-ratelimit-limit 50 
x-ratelimit-remaining 46 
x-cache-hits 0, 0 
accept-ranges bytes 
access-control-request-method * 
x-request-id ee5a74fd-2b10-4f46-9c25-5cfc53aeac6c 
access-control-expose-headers Link,X-Total,X-Per-Page,X-RateLimit-Limit,X-RateLimit-Remaining 
content-type application/json 
connection close 
content-length 55 
fastly-debug-digest f62d52c08b1ef74db89a66a0069f0a35c49e52230567905240dacf08c9ea1813 
vary Origin 
cache-control no-cache, no-store, must-revalidate 
x-timer S1496524765.369880,VS0,VE111 
x-cache MISS, MISS 
x-served-by cache-iad2123-IAD, cache-mad9429-MAD 
via 1.1 vegur, 1.1 varnish, 1.1 varnish 
date Sat, 03 Jun 2017 21:19:25 GMT 
age 0 
access-control-allow-origin * 
x-runtime 0.011667 

Fonction qui produit ledit journal

local res, headers = request({ ... }) 

print('When out of function type is: ' ..type(res) .. '\n') 
print('Desired response in string:') 
print(res .. '\n') 
resJson = cjson.decode(res) 
print('\nAfter decode, type is: ' .. type(resJson) .. '\n') 
pTable(resJson) 
print('\nPrinting header\n') 
pTable(headers) 

pTable est juste une fonction de sortie d'une table à stdout.

Merci à l'avance

+0

J'ai couru votre code (avec l'addition des pièces manquantes et des éditions minimales également dues aux pièces manquantes; Lua version 5.2, luasec, luasocket, lua-cjson de luarocks) et cela fonctionne comme prévu. Je suggère de le déboguer correctement: avec un débogueur (ZBS ou LDT). – Green

+0

Testé dans le débogueur de ZBS et il fonctionnait comme prévu. Le problème était en fait dans ma fonction de table d'impression qui a eu ma table d'en-têtes codée en dur. Rien de mal sauf moi. Merci pour l'aide –

Répondre

0

fonction Affichée et routines sont corrects. Le problème était situé dans ma fonction de table d'impression, que j'avais en quelque sorte durci mes en-têtes.