2017-08-17 1 views
1

In einer Lua-Datei möchte ich zwei APIs aufrufen und Daten von beiden gleichzeitig abrufen. Bis jetzt habe ich es geschafft, eine API aufzurufen und Daten zu drucken, aber bin nicht sicher, wie ich den zweiten Aufruf aufrufen soll, indem ich die Zeichenfolge aus dem ersten API-Aufruf verwende.Lua - wie man eine durch einen API-Aufruf erhaltene Zeichenkette weiterleitet, um einen anderen API-Aufruf aufzurufen

local json = require("json") 
local function networkListener(event) 
    local res = json.prettify(event.response) 
    local decoded = json.decode(res) 
    if (event.isError) then 
     print("--Network error-- ", (res)) 
    else 
     print("Data: " .. (res)) 
     print(decoded.results.bindings[1].person.value) 
     print(decoded.results.bindings[1].type.value) 
     local dbpuri = decoded.results.bindings[1].person.value 
     local wikititle = string.gsub(dbpuri, "http://dbpedia.org/resource/", "") 
     print (wikititle) 
    end 
end 

local headers = {} 
headers["Content-Type"] = "application/json" 
local body = "" 
local params = {} 
params.headers = headers 

params.body = body 
network.request("https://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*%0D%0Awhere+{%3Fperson+rdfs%3Alabel+%3Fperson_name+%3B+rdf%3Atype+%3Ftype+%3B+dbo%3AbirthDate+%3Fbirthdate+.%0D%0A++++bind(rand(1+%2B+strlen(str(%3Fperson))*0)+as+%3Frid)%0D%0AFILTER+regex(%3Ftype%2C+%22Person%22)%0D%0A}+order+by+%3Frid%0D%0ALIMIT+10&format=text%2Fhtml&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on&format=json", "GET", networkListener, params) 

Dies ist die erste API-Aufruf (Erfolg), aber ich möchte die lokale Variable „WikiTitle“ passieren die zweite API-Aufruf aufzurufen. Ich habe einen fast identischen Code knapp unter dem vorherigen Code (siehe unten), aber es wird eine Fehlermeldung: „Versuch, lokal‚WikiTitle‘(einen Null-Wert) zu verketten ...“

local json = require("json") 
local function networkListener(event) 
    local res = json.prettify(event.response) 
    local decoded = json.decode(res) 
    if (event.isError) then 
     print("--Network error-- ", (res)) 
    else 
     print("Data: " .. (res)) 
     print(decoded.query.pages.original.source) 
     print(decoded.warnings.pageimages) 
    end 
end 

local headers = {} 
headers["Content-Type"] = "application/json" 
local body = "" 
local params = {} 
params.headers = headers 

params.body = body 
network.request("https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles="..wikititle.."", params) 

Ich bin ein Anfänger in Lua, aber kann mir jemand helfen, eine gute Lösung zu finden? (Ich denke, ich sollte mit forward-Deklaration tun, und es ist am besten, wenn ich vermeiden kann, den Code für die zwei API-Aufrufe im Code zu wiederholen). Danke vielmals!

Antwort

1

müssen Sie in diesem Fall verschachtelte Rückrufe verwenden. Ich würde diesen speziellen Fall auch in seine eigene Funktion aufteilen, anstatt zu versuchen, eine monolithische Funktion für alles zu verwenden. um unbenannte Funktionen vorbei Arbeit zu tun ist ziemlich Standard für den Fall, basierend Welt, wo man nicht die volle Kontrolle über das ‚wann‘ haben Dinge passieren

local function getWikipediaData(event) 
    local res = json.prettify(event.response) 
    local decoded = json.decode(res) 

    if (event.isError) then 
     print("--Network error-- ", (res)) 
     return 
    end 

    local dbpuri = decoded.results.bindings[1].person.value 
    local wikititle = string.gsub(dbpuri, "http://dbpedia.org/resource/", "") 
    network.request(
     "https://en.wikipedia.org/.../&titles=".. wikititle, 
     "GET", 
     function(event) 
      -- handle the wikipedia response here 
     end, 
     params) 
end 

network.request(
    "https://dbpedia.org/sparql?...", 
    "GET", 
    getWikipediaData, 
    params); 
+0

Großartig! Es funktioniert gut. Vielen Dank! – user7665853

0

Dies ist die Antwort, die ich am Ende mit:

local json = require("json") 
local function getWikipediaData(event) 
    local res = json.prettify(event.response) 
    local decoded = json.decode(res) 
    if (event.isError) then 
     print("--Network error-- ", (res)) 
     return 
    else 
     print("Data: " .. (res)) 
     print(decoded.results.bindings[1].person.value) 
     print(decoded.results.bindings[1].type.value) 
     local dbpuri = decoded.results.bindings[1].person.value 
     local wikititle = string.gsub(dbpuri, "http://dbpedia.org/resource/", "") 
     print (wikititle) 

     network.request(
       "https://en.wikipedia.org/w/api.php?action=query&prop=pageimages&format=json&piprop=original&titles="..wikititle, 
       "GET", 
       function(event) 
        local res2 = json.prettify(event.response) 
        local decoded2 = json.decode(res2) 
        print("Data2: " .. (res2)) 
        print(decoded2.query.normalized[1].to) 
       end, 
       params) 
    end 
end 

local headers = {} 
headers["Content-Type"] = "application/json" 
local body = "" 
local params = {} 
params.headers = headers 

params.body = body 
network.request("https://dbpedia.org/sparql?default-graph-uri=http%3A%2F%2Fdbpedia.org&query=select+*%0D%0Awhere+{%3Fperson+rdfs%3Alabel+%3Fperson_name+%3B+rdf%3Atype+%3Ftype+%3B+dbo%3AbirthDate+%3Fbirthdate+.%0D%0A++++bind(rand(1+%2B+strlen(str(%3Fperson))*0)+as+%3Frid)%0D%0AFILTER+regex(%3Ftype%2C+%22Person%22)%0D%0A}+order+by+%3Frid%0D%0ALIMIT+10&format=text%2Fhtml&CXML_redir_for_subjs=121&CXML_redir_for_hrefs=&timeout=30000&debug=on&format=json", "GET", networkListener, params) 
Verwandte Themen