Передача параметров в Data Explorer через API требует оборачивания значения

Ссылка: Run Data Explorer queries with the Discourse API

При передаче параметров к SQL-запросу через API Discourse в настоящее время требует, чтобы все значения были заключены в двойные кавычки, включая целые числа, которые по умолчанию не заключаются в кавычки в некоторых системах (в частности, в json_encode PHP). Согласно 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 часов своей жизни, пытаясь решить эту проблему.

Вы знаете, как обработать это в JSON-полезной нагрузке, если я делаю POST-запрос с содержимым application/json к конечной точке run?

Или мне нужно использовать curl?

Вы не предоставили никаких деталей о платформе, которую вы используете, поэтому в общем случае:

Это зависит от библиотеки, которую вы используете для выполнения POST HTTP-запроса. Если библиотека не позволяет заключить целое число в двойные кавычки, вам, возможно, придется либо найти обходной путь, вручную создавая POST-запрос на более низком уровне, либо переключиться на другую библиотеку, поддерживающую эту функциональность.

1 лайк

Очень благодарен за ваш ответ и извиняюсь за недостаточную информацию.

Я использую пакеты Python json и requests, но не смог понять, как заставить использовать двойные кавычки.

В итоге я использовал вашу команду curl и вызвал её через subprocess в Python.

Ещё раз большое спасибо!

1 лайк