Passare i parametri a Data Explorer utilizzando l'API richiede di racchiudere un valore

Riferimento: Run Data Explorer queries with the Discourse API

Quando si passano parametri a una query SQL tramite API, Discourse attualmente richiede che tutti i valori siano racchiusi tra virgolette doppie, inclusi gli interi, che non sono racchiusi per impostazione predefinita su alcuni sistemi (in particolare json_encode di PHP). Guardando il JSON RFC, non c’è alcun requisito per usare virgolette doppie per gli interi. Questo requisito va anche contro la filosofia di “essere tolleranti in ciò che si accetta…”

Come riprodurre?

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

Il server restituisce 500 Internal Server Error.

Nei log degli errori questo viene visualizzato:

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

Questo formato funziona correttamente:

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

Sto condividendo questo non perché sono pignolo, ma per risparmiare tempo a chiunque possa incontrare un problema simile a quello che ho avuto. Mi ci è voluto un po’ per capire cosa stesse causando il problema.

3 Mi Piace

Sei un salvatore. Ho appena sprecato più di 3 ore della mia vita per affrontare questo problema.

Sai come posso gestirlo nel payload JSON se effettuo una chiamata POST con contenuto application/json all’endpoint run?

O devo usare curl?

Non hai condiviso alcun dettaglio della piattaforma che stai utilizzando, quindi in generale:

Dipende dalla libreria che stai utilizzando per effettuare la richiesta HTTP POST. Se la libreria non ti consente di racchiudere l’intero tra virgolette doppie, potresti dover trovare una soluzione alternativa costruendo manualmente la richiesta POST a un livello inferiore o passare a una libreria diversa che supporti questa funzionalità.

1 Mi Piace

apprezzo molto la tua risposta e mi scuso per non aver fornito abbastanza informazioni.

Sto usando i pacchetti json e request di Python e non sono riuscito a capire come forzare le doppie virgolette.

Quindi alla fine ho usato il tuo comando curl e l’ho chiamato tramite il subprocess di Python.

Grazie ancora mille!

1 Mi Piace