0

API query Abfrage funktioniert nicht im body

Hallo,
heute war Startschuss, um sich mit der API auseinanderzusetzen.

Der Aufruf:

let targetUrl03 := "https://xxxxxxxx/v1/teams/" + targetTeam + "/databases/" +
    targetDB +
    "/query?query=(select RuR)";
let ninoxApiKey := "XXXX";
let output := "";
let ninoxHeader := {
        Authorization: "Bearer " + ninoxApiKey,
        'Content-Type': "application/json"
    };
let res := do as server
        http("GET", targetUrl03, ninoxHeader, null)
    end;

funktioniert wunderbar, liefert die Ids der Datensätze, aber:

let targetUrl02 := "https://xxxxxxxxx/v1/teams/" + targetTeam + "/databases/" +
    targetDB +
    "/query";

let ninoxApiKey := "XXXXX";
let output := "";
let body := {
        query: "(select RuR)"
    };
let ninoxHeader := {
        Authorization: "Bearer " + ninoxApiKey,
        'Content-Type': "application/json"
    };
let res := do as server
        http("GET", targetUrl03, ninoxHeader, body)
    end;

funktioniert nicht. Ich erhalte die Meldung "Missing query parameter."

Was fehlt bzw. mache ich falsch?

Grüße Maurice

8 Antworten

null
    • UweG
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Der GET-Query funktioniert nicht mit einem JSON-Body.
    Hier ist die Query-Bedingung in der URL anzugeben.

    Wenn du die Query-Bedingung als  JSON-Body übergeben willst, musst du POST benutzen.
    Ich stelle mal eine kleine DB ein, welche beispielhaft die Nutzung der für Ninox möglichen API-Requests veranschaulicht.
    Wenn du sie in dein Team lädst und den entsprechenden API-Key eingibst, kannst du, in der DB, API-Requests auf dieselbige testen.

      • Maurice
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Danke, Uwe. Hätte ich ja wissen müssen, weil ich mich im Vorfeld doch umfangreich eingelesen hatte, wie hier: https://www.ionos.de/digitalguide/websites/web-entwicklung/get-vs-post/

      Aber man hat dann nicht mehr alles auf dem Schirm.

      Jetzt komme ich weiter, auch wenn die ersten Schritte mit API - bisher noch nie gemacht - anstrengend sind (Gestaltung und Auswertung des result-Strings), aber der Mehrwert (Stichwort Abgleich zwischen zwei DBs, die getrennt sein müssen) ist natürlich enorm.

      • Maurice
      • vor 9 Monaten
      • Gemeldet - anzeigen

       mein body der POST-Abfrage sieht nun verkürzt so aus:

      query: "select RuR.('RuR-ID' + ""#"" 
          +id.B + ""#"" 
          + id.J + ""#"" 
          + id.K.A1)

      Ich stelle mir damit den response-string zusammen, da die Tabelle RuR ca. 100 Felder haben dürfte, von denen ich geschätzt 15 benötige.

      Bei id.B ist B die id des Feldes der DB RuR.

      id.K.A1 klappt nicht. K ist Feld zu einer verknüpften Tabelle und A1 die id in der verknüpften Tabelle. Schreibe ich id.K.NameDesFeldes bekomme ich die gewünschten Einträge zurück. Ich würde lieber mit id arbeiten, damit ich die Namen in der abgefragten DB ggf. ändern kann.

      Wie ist der Trick?

      • UweG
      • vor 9 Monaten
      • Gemeldet - anzeigen

      Verstehe ich leider nicht. Sorry.

      • Maurice
      • vor 9 Monaten
      • Gemeldet - anzeigen

       statt "select TABELLE. (FELDNAME1 + FELDNAME2)"

      verwende ich "select TABELLE.(id.ID_FELD1 + id.ID_FELD2)"

      Die id der Felder der Tabelle habe ich mit der von dir bereitgestellten API-Datenbank abgefragt. Dort steht beispielsweise:

      "id": "B",
      "name": "Name",
      "type": "string"

      also statt select TABELLE.(Name + ...) schreibe ich jetzt select TABELLE.(id.B + ...) 

      Ein Feld, das zu einer verknüpften Tabelle gehört,  hat beispielsweise

      "id": "K",
      "name": "Schule",
      "type": "ref",
      "referenceToTable": "E",
      "reverseField": "A1"

      Es funktioniert select TABELLE.(Schule.'Name der Schule'), wobei 'Name der Schule' die Feldbezeichnung in der verknüpften Tabelle ist.

      select TABELLE.(id.K.A1) funktioniert nicht bzw. statt dem Namen der Schule bekomme ich eine 32-stellige Zahl angezeigt. select TABELLE.(id.K.'Name der Schule') funktioniert.

      Ich hoffe, ich konnte mich jetzt besser ausdrücken.

    • UweG
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Wobei A1 wohl nicht funktioniert.
    id.K ist die ID der Verknüpfung.
    Jetzt musst du noch die ID von dem Feld 'Name der Schule' hinten anfügen.
    Laut deiner Beschreibung ist A1 aber die Rückverknüpfung.
    Ruf mal das Schema von der Tabelle Schule ab und schau nach wie die passende FeldID lautet.

      • Maurice
      • vor 9 Monaten
      • Gemeldet - anzeigen

       Prima das hat jetzt gut geklappt. In der Tat mit der FeldID aus der Ursprungstabelle hat das geklappt, dort ist die FeldID "A". Also der entsprechende Abfragestring

      id.K.id.A

      Jetzt was Neues:
      Ich habe auch ein Feld, das auf eine Kreuztabelle (m:n) verweist und von dort natürlich auf die "Ursprungstabelle" In der Ursprungstabelle stehen Jahreszahlen.

      Mit

      id.X4.id.B.id.A

      erhalte ich je nach Datensatz den String zurück 2020 oder 202020222023 (bei drei Jahreszahlen).

      In der Zieltabelle möchte ich natürlich den Eintrag in einem Textfeld 2020,2022,2023.

      mit id.X4.concat(id.B.id.A) oder id.X4.id.B.concat(id.A) ging es nicht. Ich musste mir mit:

      let kjLaenge := length(item(refArray, 30)) / 4;
                  let thisKursjahre := [""][false];
                  for k from 0 to kjLaenge do
                      thisKursjahre := array(thisKursjahre, [substring(item(refArray, 30), k * 4, (k + 1) * 4)])
                  end;
                  if thisRef.Kursjahre != text(thisKursjahre) then
                      thisRef.(Kursjahre := text(thisKursjahre))
                  end
      

      helfen. Das geht. Interessehalber:

      gibt es einen Weg die kommaseparierte Darstellung schon aus dem result-String zu erhalten?

    • UweG
    • vor 9 Monaten
    • Gemeldet - anzeigen

    Anbei noch eine kleine DB um Query-Aufrufe zu testen und die ID's / Schema leichter zu ermitteln.
    Man kann sie für public/private Clouds nutzen.
    Ich werde sie noch in einer nächsten Version um den exec-Query erweitern.
     

Content aside

  • vor 9 MonatenZuletzt aktiv
  • 8Antworten
  • 97Ansichten
  • 2 Folge bereits