`DataExplorer::ValidationError: Fehlender Parameter`, wenn Data Explorer-Abfragen mit [params] über die API ausgeführt werden

In Discourse gibt es einen Fehler in der API, wenn Data Explorer-Abfragen mit Parametern ausgeführt werden (beide unten stehenden Abfragen funktionieren wie erwartet, wenn sie im Browser ausgeführt werden).

Wenn man die Anweisungen von Run Data Explorer queries with the Discourse API befolgt und

-F 'params={\"group_id\":\"64\"}'

verwendet, um diese Abfrage auszuführen (die einen Parameter ohne gesetzten Standardwert hat)

-- [params]
-- int :group_id
select id, name from groups
where id = :group_id

führt dies zu einem Fehler: {\"success\":false,\"errors\":[\"DataExplorer::ValidationError: Missing parameter group_id of type int\"]}

Wenn eine Abfrage einen Parameter mit gesetztem Standardwert hat, ist der API-Aufruf erfolgreich, aber das Ergebnis ist dasselbe, unabhängig vom übermittelten Wert über -F 'params=

-- [params]
-- int :group_id = 2
select id, name from groups
where id = :group_id
-F 'params={\"group_id\":\"64\"}'

und gibt immer das Ergebnis für den Standardwert des Parameters zurück: {\"success\":true,\"errors\":[],\"duration\":0.2,\"result_count\":1,\"params\":{},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[2,\"moderators\"]]}

Was ist der vollständige Befehl, den Sie verwenden?
Liefern Sie -X POST und alle erforderlichen Header?

Der Browser verwendet die API. Es ist unwahrscheinlich, dass Sie ein großes Problem beschreiben, wenn es sich um Discourse handelt.

Der aus How to run Data Explorer queries with the Discourse API mit -X POST und allen erforderlichen Headern.

Dies ist kein Syntaxproblem. Wenn Sie die letzte Zeile aus dem OP überprüfen, sehen Sie, dass curl einen Erfolg zurückgibt. Das Ergebnis ist nur falsch.

Jay, ich verstehe die Bedeutung dieses Satzes nicht. Haben Sie zufällig versucht, das Problem mit den minimalen Beispielen aus dem OP zu reproduzieren?


@michaeld, @pfaffman
Ich zögere, diesen Teil zu schreiben, hauptsächlich weil ich Ihre Hingabe und Expertise bei der kostenlosen Unterstützung der Community bewundere und respektiere. Ich habe schon oft von Ihren Erkenntnissen profitiert. Aber diesmal habe ich das Gefühl, dass keiner von Ihnen über die ersten paar Zeilen des Berichts hinaus gelesen hat (ich recherchiere und teste gründlich, bevor ich im Support-Bereich poste, und ich versuche immer, detaillierte Reproduktionsschritte einzuschließen).

Die Sache ist, meiner Erfahrung nach, wenn eine Supportanfrage eine solche Antwort erhält – vorausgesetzt, es handelt sich um einen Benutzerfehler, ohne zu versuchen, das Problem anhand der bereitgestellten Schritte zu reproduzieren (insbesondere von so erfahrenen Mitgliedern wie Ihnen) – wird das eigentliche Problem vom Discourse-Team wahrscheinlich nicht erkannt.

Andererseits würde Ihre Antwort, wenn sie die tatsächlichen Reproduktionsschritte validiert oder entkräftet, dem Anspruch Gewicht verleihen (oder auf eine andere Ursache hinweisen), was eher die Aufmerksamkeit des Teams auf sich zieht und zur endgültigen Behebung führt.

Ich weiß, dass wahrscheinlich 99 % der Fälle Benutzer sind, die die Anweisungen nicht lesen (ich sollte es wissen, ich war schon dort). Aber wenn wir das wissen, sollten wir dann nicht denselben Fehler machen, indem wir versuchen, Supportanfragen schnell statt gründlich zu beantworten?

Ich bin überrascht und ehrlich gesagt ein wenig enttäuscht, das zu lesen. Ich habe Ihr Problem sehr gründlich gelesen und hatte folgende Beobachtungen:

  1. Sie haben keine vollständigen und detaillierten Reproduktionsschritte angegeben, da Sie nicht die gesamte Befehlszeile angegeben haben.

  2. Die Tatsache, dass Sie nur dann eine Ausgabe erhalten, wenn Sie einen Standardwert für den Parameter festlegen, lässt mich vermuten, dass Discourse Ihr Parametername/Wert-Paar nicht sieht.

Die Schlussfolgerung, dass Ihre Befehlszeile korrekt sein muss, weil Sie eine Ausgabe erhalten, ist falsch – und übersieht die Tatsache, dass Sie nicht die Ausgabe erhalten, die mit dem von Ihnen angegebenen Parameter verbunden ist, sondern mit seinem Standardwert.

  1. Ich habe versucht, dieses Problem zu reproduzieren – und kann es nicht.
curl -X POST "https://REDACTED/admin/plugins/explorer/queries/2/run" -H "Content-Type: multipart/form-data;" -H "Api-Key: REDACTED" -H "Api-Username: system" -F 'params={"group_id":"1"}'

{"success":true,"errors":[],"duration":0.3,"result_count":1,"params":{"group_id":"1"},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[1,"admins"]]}

Diese drei Beobachtungen veranlassten mich, Sie um ein Detail in Ihrer Befehlszeile zu bitten, da ich überlegte, unter welchen Umständen Discourse den Parameter nicht sehen würde, und ich bin davon überzeugt, dass dies ein Syntaxproblem ist.

Einen Tippfehler oder einen Fehler zu machen, ist nicht nur unerfahrenen Benutzern vorbehalten. Ich mache jeden Tag triviale Fehler.

3 „Gefällt mir“

Michael (und Jay), bitte nehmt meine Entschuldigung an. Ich ging davon aus, dass ihr die Reproduktionsschritte nicht wirklich durchgeführt hattet, was ich nicht hätte tun sollen! Ich werde in Zukunft vorsichtiger sein, solche Dinge nicht anzunehmen.

Ich hoffe, ihr habt noch Geduld mit mir: Ich habe denselben Curl-Befehl wie ihr verwendet (ich habe euren diesmal tatsächlich kopiert, um ganz sicher zu sein), mit diesem Ergebnis:

{\"success\":true,\"errors\":[],\"duration\":0.2,\"result_count\":1,\"params\":{},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[2,\"moderators\"]]}

und im Vergleich zu eurem

{\"success\":true,\"errors\":[],\"duration\":0.3,\"result_count\":1,\"params\":{\"group_id\":\"1\"},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[1,\"admins\"]]}

tritt das Problem sofort auf: params\":{} vs \"params\":{\"group_id\":\"1\"} in der Ausgabe, was eure Analyse korrekt macht: mein Server sieht/verarbeitet -F 'params={\"group_id\":\"1\"}' nicht richtig.

Jetzt, wo ich die detaillierten Schritte eurer Überlegung sehe, ergibt es vollkommen Sinn, warum ihr das Syntaxproblem vermutet habt (ich wünschte, ich könnte eure Gedanken lesen, bevor ich poste :blush:). Aber da ich die exakte Syntax verwendet habe, die ihr verwendet habt, kann es jetzt kein Syntaxproblem sein, oder?

Der Server läuft auf dem neuesten Build. Was könnte das Problem sein?

[Edit]: Habe dies auf einem anderen Standard-Standalone-Installationsserver 2.9.0.beta3 (8040b95e8c) mit demselben Problem versucht. Der erste Server ist auf 2.9.0.beta3 (0f7b9878ff)

Es sei denn, dies ist ein seltsames Curl-Problem, ich bin ratlos.

curl 7.79.1 (Windows) libcurl/7.79.1 Schannel
Release-Date: 2021-09-22
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
2 „Gefällt mir“

Windows versteht diese einfachen Anführungszeichen nicht. Sie müssen also reguläre doppelte Anführungszeichen verwenden und diese mit Backslashes maskieren.

Verwenden Sie dies:

-F params={"group_id":"1"}

(Kopieren Sie dies nicht, da iOS die Anführungszeichen falsch gesetzt hat)

3 „Gefällt mir“

Nun, wie dumm ich mich jetzt fühle :rofl:

Danke Michael, du machst deinem Titel wirklich alle Ehre! Ich werde dir nicht mehr zweifeln.

4 „Gefällt mir“

Das habe ich nicht. Wenn Sie sagen, dass der OP falsch liegt, dann ist mein Kommentar nicht hilfreich. Entschuldigen Sie das.

Oh, und jetzt sehe ich Michaels Antwort. Tatsächlich ist es eine Billion Mal schwieriger, Anführungszeichen und Escapes richtig hinzubekommen, als man denken würde.

2 „Gefällt mir“

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.