通过 API 向 Data Explorer 传递参数时,需要括起值

参考:Run Data Explorer queries with the Discourse API

当使用 API 将参数传递给 SQL 查询时,Discourse 目前要求所有值都必须用双引号括起来,包括整数。在某些系统(例如 PHP 的 json_encode)上,整数默认不被括起来。查看 JSON RFC,整数不需要双引号。此要求也违背了“在接受方面要宽容……”的原则。

如何重现?

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

服务器返回 500 内部服务器错误。

在错误日志中显示如下:

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 多个小时来处理这个问题。

你知道如何在 POST 调用 run 端点时使用 application/json 内容来处理 JSON payload 吗?

或者我必须使用 curl?

您没有分享您正在使用的平台的任何详细信息,因此一般而言:

这取决于您用来发出 POST HTTP 请求的库。如果库不允许您将整数用双引号括起来,您可能需要通过手动构建更低级别的 POST 请求来找到一种解决方法,或者切换到支持此功能的其他库。

1 个赞

非常感谢您的回复,也很抱歉没有提供足够的信息。

我使用的是 Python 的 json 和 request 包,但一直无法弄清楚如何强制使用双引号。

所以最后我使用了您的 curl 命令,并通过 Python 的 subprocess 调用。

再次非常感谢!

1 个赞