Overload bei API Abfrage?
Moin die Herren
teste gerade eine API Abfrage bei Food Data Central .... läuft bisher recht gut ... 2 Dinge bereiten mir Kopfschmerzen.
let choice := text(chosen(dataType));
let qurl := mainURL + SubURL1 + "query=" + 'Search Food' + "&dataType=" + choice + "&api_key=" + API;
let response := http("GET", qurl);
if response.error then
alert(text(response.error))
else
let cntFoods := number(response.result.totalHits);
if cntFoods > 50 then
let qurlp := mainURL + SubURL1 + "query=" + 'Search Food' + "&dataType=" + choice + "&api_key=" + API + "&pageSize=" + cntFoods;
response := http("GET", qurlp)
end;
let foods := response.result.foods;
for i in range(0, cntFoods) do
let currFood := item(foods, i);
let newResult := (create 'SEARCH:food');
newResult.(fdcId := currFood.fdcId);
newResult.(description := currFood.description);
newResult.(additionalDescriptions := currFood.additionalDescriptions);
newResult.(dataType := currFood.dataType);
newResult.(publishedDate := currFood.publishedDate);
newResult.(brandOwner := currFood.brandOwner);
newResult.(ingredients := currFood.ingredients)
end
end
hier erst einmal der Abfrage Code ..
Frage 1: warum funktioniert er nicht als Field Trigger sondern nur als Button?
Frage 2: Ab einer bestimmten Anzahl von Ergebnissen (irgendwo zwischen 200 und 300) hängt sich Ninox komplett auf... Abfragen mit Ergebnissen unter 200 laufen zuverlässig. Kurz zur Erklärung die API unterteilt in Pages a 50 Entries, daher die Extra Abfrage nach totalHits und die Anpassung der Abrage mit erhöhter PagesSize ... wen hier jemand eine elegantere Lösung, gern her damit, doppelte Abfrage belastet ja die API.
Ich habe den Verdacht, dass es ein Limit bei der Größe der JSON Result gibt ... kann das sein?
3 Antworten
-
Hallo Dan,
1. Es ist einfach so. Soweit ich mich erinnere, kann man Rest-Anfrage in Web auch als Trigger starten und in der App läuft diese nur als Button-Intraktion.
2. Wenn die Anzahl der Antworten bekannt ist, würde ich eine Schleife vorschalten und die Pagegröße bei 50 lassen.
sowas wie for i from 1 to cntFoods step 50 doLeo
-
zum Ersten: damit kann ich leben :)
zum Zweiten: das hatte ich schon mal umgesetzt, allerdings hat man bei größeren Ergebniszahlen eben diverse Abfragen, da jede Page separat aufgerufen werden muss. Aber ich werde es noch mal probieren, vll löst es das Problem mit dem overflow ... das mit der Step-Anweisung muss ich mir mal anschauen, ich weiss gerad nicht, wieso er in 50er Schritten die Schleife durchlaufen soll ... im Prinzip brauche ich eine Schleife, die auf Page 1 50mal durchläuft, dann Page 2 etc ... bei jedem Durchlauf gibts ne neue Abfrage auf die jeweilige Page ... oder denke ich zu kompliziert?
-
Hallo Dan,
Da habe ich mich falsch ausgedruckt. Die Schleife mit 50er Schritt ist natürlich bullshit. Man musste nur Anzahl der Pages ermitteln (sowas wie:
for i in range ceil(cntFoods / 50) do
let PageNr:=i+1
und dann wie du es sagst mehrmals AnfragenLeo
Content aside
- vor 4 JahrenZuletzt aktiv
- 3Antworten
- 545Ansichten