API経由でData Explorerにパラメータを渡すには、値を囲むのが必須

Reference: Run Data Explorer queries with the Discourse API

APIを使用してSQLクエリにパラメータを渡す場合、Discourseは現在、整数(一部のシステム(特にPHPのjson_encode)ではデフォルトでカプセル化されない)を含むすべての値を二重引用符で囲む必要があります。 JSON RFCを見ると、整数に二重引用符を使用する必要はありません。この要件は、「受け入れるものに対して寛容である」という哲学にも反します。

再現方法:

-F 'params={\"user_id\":2}'

サーバーは500 Internal Server Errorを返します。

エラーログには次のように表示されます。

NoMethodError (undefined method `downcase' for 2:Integer)
app/controllers/application_controller.rb:424:in `block in with_resolved_locale'
app/controllers/application_controller.rb:424:in `with_resolved_locale'
lib/middleware/omniauth_bypass_middleware.rb:64:in `call'
lib/content_security_policy/middleware.rb:12:in `call'
lib/middleware/csp_script_nonce_injector.rb:12:in `call'
config/initializers/008-rack-cors.rb:14:in `call'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:35:in `call_app'
lib/freedom_patches/rails_rack_logger_from_rails_7_2.rb:22:in `call'
config/initializers/100-quiet_logger.rb:20:in `call'
config/initializers/100-silence_logger.rb:29:in `call'
lib/middleware/missing_avatars.rb:22:in `call'
lib/middleware/turbo_dev.rb:31:in `call'
lib/middleware/processing_request.rb:12:in `call'

Backtrace

plugins/discourse-data-explorer/lib/discourse_data_explorer/parameter.rb:121:in `cast_to_ruby'
...

この形式は正しく機能します。

-F 'params={\"user_id\":\"2\"}'

これは私が細かいことにうるさいから共有しているのではなく、私と同じような問題に遭遇した人の時間を節約するためです。問題の原因を突き止めるのにかなりの時間がかかりました。

「いいね!」 3

命の恩人です。この問題に取り組むのに3時間以上も無駄にしてしまいました。

application/json コンテンツで run エンドポイントに POST 呼び出しを行う場合、JSON ペイロードでこれをどのように処理できるかご存知ですか?

それとも、curl を使うしかないのでしょうか?

使用しているプラットフォームの詳細が共有されていないため、一般的な回答になります。

これは、POST HTTP リクエストを行うために使用しているライブラリによって異なります。ライブラリで整数を二重引用符で囲むことができない場合は、低レベルで POST リクエストを手動で構築する回避策を見つけるか、この機能に対応している別のライブラリに切り替える必要がある場合があります。

「いいね!」 1

ご返信ありがとうございます。情報が不足していて申し訳ありません。

Pythonのjsonとrequestパッケージを使用しており、ダブルクォートを強制する方法がわかりませんでした。

最終的に、curlコマンドを使用し、Pythonのsubprocess経由で呼び出しました。

重ねて感謝いたします!

「いいね!」 1