Passage de paramètres à Data Explorer en utilisant l'API nécessite d'entourer une valeur

Référence : Run Data Explorer queries with the Discourse API

Lors du passage de paramètres à une requête SQL via l’API, Discourse exige actuellement que toutes les valeurs soient encapsulées entre guillemets doubles, y compris les entiers, qui ne sont pas encapsulés par défaut sur certains systèmes (notamment json_encode de PHP). En examinant la JSON RFC, il n’est pas obligatoire d’utiliser des guillemets doubles pour les entiers. Cette exigence va également à l’encontre de la philosophie « soyez tolérant dans ce que vous acceptez… »

Comment reproduire ?

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

Le serveur renvoie une erreur interne du serveur 500.

Dans les journaux d’erreurs, cela s’affiche :

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

Ce format fonctionne correctement :

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

Je partage cela non pas par esprit de contradiction, mais pour faire gagner du temps à quiconque pourrait rencontrer un problème similaire au mien. Il m’a fallu un certain temps pour comprendre ce qui causait le problème.

3 « J'aime »

Vous me sauvez la vie. Je viens de perdre plus de 3 heures de ma vie à essayer de résoudre ça.

Savez-vous comment je peux gérer cela dans une charge utile JSON si je fais un appel POST avec un contenu application/json au point de terminaison run ?

Ou dois-je passer par curl ?

Vous n’avez partagé aucun détail sur la plateforme que vous utilisez, donc de manière générale :

Cela dépend de la bibliothèque que vous utilisez pour effectuer la requête HTTP POST. Si la bibliothèque ne vous permet pas d’encapsuler l’entier entre guillemets doubles, vous devrez peut-être trouver une solution de contournement en construisant manuellement la requête POST à un niveau inférieur ou passer à une bibliothèque différente qui prend en charge cette fonctionnalité.

1 « J'aime »

J’apprécie vraiment votre réponse et désolé de ne pas avoir fourni assez d’informations.

J’utilise les packages json et request de Python et je n’ai pas réussi à forcer les guillemets doubles.

J’ai donc finalement utilisé votre commande curl et l’ai appelée via le sous-processus Python.

Merci encore beaucoup !

1 « J'aime »