Pasar parámetros a Data Explorer usando API requiere encerrar un valor

Referencia: Run Data Explorer queries with the Discourse API

Al pasar parámetros a una consulta SQL usando la API, Discourse actualmente requiere que todos los valores estén encapsulados con comillas dobles, incluidos los enteros, que no están encapsulados por defecto en algunos sistemas (específicamente json_encode de PHP). Si observamos la JSON RFC, no hay ningún requisito para usar comillas dobles para los enteros. Este requisito también va en contra de la filosofía de “ser tolerante en lo que se acepta…”

¿Cómo reproducirlo?

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

El servidor devuelve un error interno del servidor 500.

En los registros de errores, esto se muestra:

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 correctamente:

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

Comparto esto no porque sea quisquilloso, sino para ahorrar tiempo a cualquiera que pueda encontrar un problema similar al mío. Me tomó un tiempo darme cuenta de lo que estaba causando el problema.

3 Me gusta

Eres un salvavidas. Acabo de perder más de 3 horas de mi vida lidiando con esto.

¿Sabes cómo puedo manejar esto en la carga útil JSON si hago una llamada POST con contenido application/json al endpoint de ejecución?

¿O tengo que usar curl?

No has compartido ningún detalle de la plataforma que estás utilizando, así que en general:

Eso depende de la biblioteca que estés utilizando para realizar la solicitud HTTP POST. Si la biblioteca no te permite envolver el entero entre comillas dobles, es posible que necesites encontrar una solución alternativa construyendo manualmente la solicitud POST en un nivel inferior o cambiar a una biblioteca diferente que admita esta funcionalidad.

1 me gusta

realmente aprecio tu respuesta y lamento no haber proporcionado suficiente información.

Estoy usando los paquetes json y request de Python y no pude averiguar cómo forzar las comillas dobles.

Así que finalmente usé tu comando curl y lo llamé a través del subproceso de Python.

¡Muchas gracias de nuevo!

1 me gusta