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 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시간 넘게 허비했거든요.

run 엔드포인트에 application/json 콘텐츠로 POST 요청을 보낼 때, JSON 페이로드에서 이 문제를 어떻게 처리할 수 있는지 아시나요?

아니면 curl을 사용해야 하나요?

사용 중인 플랫폼에 대한 세부 정보를 공유하지 않으셨으므로 일반적인 답변은 다음과 같습니다:

POST HTTP 요청을 수행하는 데 사용되는 라이브러리에 따라 다릅니다. 라이브러리가 정수를 이중 인용 부호로 감싸지 못한다면, 하위 레벨에서 POST 요청을 수동으로 구성하여 우회하는 방법을 찾아야 하거나, 이 기능을 지원하는 다른 라이브러리로 전환해야 할 수 있습니다.

1개의 좋아요

답장 주셔서 정말 감사드리고, 충분한 정보를 제공하지 못한 점 죄송합니다.

Python의 json과 request 패키지를 사용했는데, 이중 따옴표를 강제하는 방법을 찾지 못했습니다.

결국 말씀해 주신 curl 명령어를 Python의 subprocess로 호출하는 방식으로 해결했습니다.

다시 한번 정말 감사합니다!

1개의 좋아요