Passar parâmetros para o Data Explorer usando API requer envolver um valor

Referência: Run Data Explorer queries with the Discourse API

Ao passar parâmetros para uma consulta SQL usando a API, o Discourse atualmente exige que todos os valores sejam encapsulados usando aspas duplas, incluindo inteiros, que não são encapsulados por padrão em alguns sistemas (notavelmente json_encode do PHP). Olhando para o JSON RFC, não há requisito para usar aspas duplas para inteiros. Este requisito também vai contra a filosofia de “seja tolerante no que você aceita…”

Como reproduzir?

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

O servidor retorna 500 Internal Server Error.

Nos logs de erro, isso aparece:

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'
...

Este formato funciona corretamente:

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

Estou compartilhando isso não porque sou detalhista, mas para economizar tempo para qualquer pessoa que possa encontrar um problema semelhante ao meu. Levei um tempo para descobrir o que estava causando o problema.

3 curtidas

Você é um salva-vidas. Acabei de perder mais de 3 horas da minha vida para lidar com isso.

Você sabe como posso lidar com isso em um payload JSON se eu fizer uma chamada POST com conteúdo application/json para o endpoint de execução?

Ou tenho que ir com o curl?

Você não compartilhou nenhum detalhe da plataforma que está usando, então, de modo geral:

Isso depende da biblioteca que você está usando para fazer a solicitação HTTP POST. Se a biblioteca não permitir que você envolva o inteiro entre aspas duplas, você pode precisar encontrar uma solução alternativa construindo manualmente a solicitação POST em um nível mais baixo ou mudar para uma biblioteca diferente que suporte essa funcionalidade.

1 curtida

realmente aprecio sua resposta e desculpe por não fornecer informações suficientes.

Estou usando os pacotes json e request do Python e não consegui descobrir como forçar as aspas duplas.

Então, finalmente, usei seu comando curl e o chamei via subprocesso do Python.

Muito obrigado novamente!

1 curtida