API経由で[params]を使用したData Explorerクエリの実行時に`DataExplorer::ValidationError: Missing parameter`

Discourse API には、(以下の両方のクエリはブラウザから実行すると期待どおりに動作します) パラメータを含む Data Explorer クエリを実行する際にバグがあります。

Run Data Explorer queries with the Discourse API の指示に従い、

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

を使用してこのクエリを実行します (デフォルト値が設定されていないパラメータがあります)。

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

すると、エラー {\"success\":false,\"errors\":[\"DataExplorer::ValidationError: Missing parameter group_id of type int\"]} が発生します。

クエリにデフォルト値が設定されたパラメータがある場合、API 呼び出しは成功しますが、-F 'params= を介して提供された値に関係なく、結果は 同じ です。

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

そして、常にパラメータの デフォルト値 の結果を返します: {\"success\":true,\"errors\":[],\"duration\":0.2,\"result_count\":1,\"params\":{},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[2,\"moderators\"]]}

使用している完全なコマンドは何ですか?
-X POST と必要なヘッダーをすべて指定していますか?

ブラウザはAPIを使用します。それがディスコースの大きな問題であるとは考えにくいです。

Discourse API で Data Explorer クエリを実行する方法 のコマンドに -X POST と必要なヘッダーをすべて追加したものです。

これは構文の問題ではありません。OP の最後の行を確認すると、curl が成功を返していることがわかります。結果が正しくないだけです。

Jay さん、この文の意味がわかりません。OP で提供されている最小限の例を使って問題を再現しようとしましたか?


@michaeld@pfaffman
この部分を書くのをためらっています。なぜなら、皆さんがコミュニティに無料サポートを提供するために尽力し、専門知識を発揮されていることを称賛し、尊敬しているからです。以前にも皆さんの洞察から何度も恩恵を受けてきました。しかし、今回は皆さんのどちらも、レポートの最初の数行を読み進めていないのではないかと感じています(私はサポートカテゴリに投稿する前に、徹底的に調査しテストすることに非常に注意しており、常に_詳細な再現手順_を含めるように努めています)。

私の経験では、サポートリクエストに対してこのような応答があった場合、つまり、提供された手順を実際に再現しようとせずにユーザーエラーを想定した場合(特に皆さん自身のような経験豊富なメンバーから)、Discourse チームが実際の問題を拾い上げる可能性は低くなります。

一方で、皆さんの応答が_実際の再現手順_を検証または無効化するものであれば、それは主張に重みを与え(または別の原因を指摘し)、チームの注意を引き、最終的な修正につながる可能性が高くなります。

おそらく 99% のケースは、ユーザーが指示を読んでいないだけだと知っています(私も経験があるのでわかります)。しかし、これを知っているなら、迅速に回答するのではなく、徹底的に回答することによって、同じ間違いを犯すべきではないのではないでしょうか?

驚いていますし、正直に言って少しがっかりしました。あなたの問題を非常に徹底的に読み、以下の観察結果がありました。

  1. コマンドライン全体を含んでいないため、実際には完全で詳細な再現手順を提供していませんでした。

  2. パラメータにデフォルト値を設定した場合にのみ出力が得られるという事実は、Discourse がパラメータ名/値のペアを「見て」いないことを示唆しています。

出力が得られるからといってコマンドラインが正しいという結論は間違っています。それは、提供したパラメータに関連する出力ではなく、デフォルト値に関連する出力が得られているという事実を見落としています。

  1. この問題を再現しようとしましたが、できませんでした。
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"]]}

これらの 3 つの観察結果から、Discourse がパラメータを見ない状況を考慮していたため、コマンドラインの詳細を尋ねました。これは構文の問題であると確信しています。

タイプミスや間違いは、経験の浅いユーザーに限定されるものではありません。私も毎日些細な間違いを犯します。

「いいね!」 3

マイケル(そしてジェイ)、申し訳ありませんでした。あなたが実際にリプロ手順を 実行しなかった と思い込んでしまいました。それはすべきではありませんでした!今後はそのようなことを推測しないように注意します。

まだ私に付き合ってくれることを願っています。あなたのものと全く同じcurlコマンドを使用しました(今回は100%確実にするために、あなたのコマンドをコピーしました)。結果は以下の通りです。

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

そしてあなたのものと比較すると

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

問題はすぐに明らかになります。出力の params":{}\"params\":{\"group_id\":\"1\"} の違いです。これにより、あなたの分析が正しかったことが証明されます。私のサーバーは -F 'params={\"group_id\":\"1\"}' を正しく認識/処理していません。

あなたの推論の詳細な手順を見ると、構文エラーを推測した理由がよくわかります(投稿する前にあなたの心を読むことができればよかったのにと思います :blush:)。しかし、あなたが使用したのと同じ構文を使用したので、 は構文エラーではないはずですよね?

サーバーは最新ビルドです。何が問題だとお考えですか?

[編集]: 別の標準的なスタンドアロンインストールサーバー 2.9.0.beta3 (8040b95e8c) で試しましたが、問題は同じでした。最初のサーバーは 2.9.0.beta3 (0f7b9878ff) です。

これが奇妙なcurlの問題でない限り、お手上げです。

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

Windows はシングルクォートを認識しません。そのため、通常のダブルクォートを使用し、バックスラッシュでエスケープする必要があります。

次のように入力してください。

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

(iOS がクォートを正しく表示していないため、このままコピー&ペーストしないでください)

「いいね!」 3

なんてこった、今すごく愚かに感じるよ🤣

マイケル、ありがとう。君は本当にその称号にふさわしい!もう君を疑わないよ。

「いいね!」 4

試していません。もしOPが間違っていると言うなら、私のコメントは役に立たないということです。すみません。

ああ、そしてマイケルの返信を見ました。確かに、引用符やエスケープを正しく処理することは、考えられているよりも何十億倍も難しいことです。

「いいね!」 2

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