`DataExplorer::ValidationError: Parametro mancante` quando si eseguono query Data Explorer con [params] tramite API

C’è un bug nell’API di Discourse quando si eseguono query di Data Explorer contenenti parametri (entrambe le query di seguito funzionano come previsto quando vengono eseguite dal browser).

Seguendo le istruzioni da Run Data Explorer queries with the Discourse API e utilizzando

-F 'params={\"group_id\":\"64\"}'

per eseguire questa query (che ha un parametro senza il suo valore predefinito impostato)

-- [params]
-- int :group_id
select id, name from groups
where id = :group_id

risulta in un errore: {\"success\":false,\"errors\":[\"DataExplorer::ValidationError: Missing parameter group_id of type int\"]}

Quando una query ha un parametro con il suo valore predefinito impostato, la chiamata API ha successo, ma il risultato è lo stesso indipendentemente dal valore fornito tramite -F 'params=

-- [params]
-- int :group_id = 2
select id, name from groups
where id = :group_id
-F 'params={\"group_id\":\"64\"}'

e restituisce sempre il risultato per il valore predefinito del parametro: {\"success\":true,\"errors\":[],\"duration\":0.2,\"result_count\":1,\"params\":{},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[2,\"moderators\"]]}

Qual è il comando completo che stai usando?
Stai fornendo -X POST e tutte le intestazioni richieste?

Il browser utilizza l’API. È improbabile che tu stia descrivendo un grande “se” nel discorso.

Quello da Come eseguire query di Data Explorer con l’API di Discourse completo di -X POST e tutte le intestazioni richieste.

Questo non è un problema di sintassi, se controlli l’ultima riga dell’OP vedrai che curl restituisce un successo, è solo che il risultato non è corretto.

Jay, non capisco il significato di questa frase. Hai per caso provato a riprodurre il problema usando gli esempi minimi forniti nell’OP?


@michaeld, @pfaffman
Esito a scrivere questa parte, principalmente perché ammiro e rispetto la vostra dedizione e competenza nel fornire supporto gratuito alla community, so di aver beneficiato dei vostri spunti in numerose occasioni in passato. Ma questa volta ho la sensazione che nessuno dei due abbia letto oltre le prime righe del report (sono molto attento a ricercare e testare a fondo prima di pubblicare nella categoria di supporto, e cerco sempre di includere passaggi dettagliati per la riproduzione).

Il fatto è che, secondo la mia esperienza, quando una richiesta di supporto riceve una risposta del genere - presumendo un errore dell’utente senza cercare di riprodurre effettivamente il problema utilizzando i passaggi forniti (specialmente da membri esperti come voi) - è meno probabile che il problema reale venga rilevato dal team di Discourse.

D’altra parte, se la vostra risposta convalidasse o invalidasse i passaggi effettivi per la riproduzione, ciò darebbe peso all’affermazione (o indicherebbe un’altra causa) che attirerà più probabilmente l’attenzione del team e porterà all’eventuale correzione.

So che probabilmente il 99% dei casi sono solo utenti che non leggono le istruzioni (dovrei saperlo, ci sono già passato). Ma sapendo questo, probabilmente non dovremmo commettere lo stesso errore cercando di rispondere rapidamente ai problemi di supporto, piuttosto che in modo approfondito?

Sono sorpreso e, onestamente, un po’ deluso nel leggere questo. Ho letto il tuo problema molto attentamente e ho avuto le seguenti osservazioni:

  1. In realtà non hai fornito passaggi di riproduzione completi e dettagliati poiché non hai incluso l’intera riga di comando.

  2. Il fatto che tu ottenga un output solo quando imposti un valore predefinito per il parametro mi porta a credere che Discourse non stia vedendo la tua coppia nome/valore del parametro.

La conclusione che la tua riga di comando debba essere corretta perché ottieni un output è sbagliata, e trascura il fatto che non stai ottenendo l’output associato al parametro che hai fornito, ma a quello predefinito.

  1. Ho provato a - e non riesco a - riprodurre questo problema.
curl -X POST "https://REDACTED/admin/plugins/explorer/queries/2/run" -H "Content-Type: multipart/form-data;" -H "Api-Key: REDACTED" -H "Api-Username: system" -F 'params={"group_id":"1"}'

{"success":true,"errors":[],"duration":0.3,"result_count":1,"params":{"group_id":"1"},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[1,"admins"]]}

Queste tre osservazioni mi hanno portato a chiederti un dettaglio nella tua riga di comando, poiché stavo considerando quali circostanze avrebbero portato Discourse a non vedere il parametro, e sono convinto che si tratti di un problema di sintassi.

Fare un refuso o un errore non è riservato agli utenti inesperti. Io commetto errori banali ogni giorno.

3 Mi Piace

Michael (e Jay), per favore accettate le mie scuse, ho presunto che non abbiate effettivamente eseguito i passaggi di riproduzione, cosa che non avrei dovuto fare! Sarò più attento a non presumere tali cose in futuro.

Sperando che siate ancora disposti a sopportarmi: ho usato lo stesso identico curl che avete usato voi (questa volta l’ho copiato, solo per essere sicuro al 100%), con questo risultato:

{"success":true,"errors":[],"duration":0.2,"result_count":1,"params":{},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[2,"moderators"]]}

e confrontandolo con il vostro
{"success":true,"errors":[],"duration":0.3,"result_count":1,"params":{"group_id":"1"},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[1,"admins"]]}

il problema emerge immediatamente: params":{} vs "params":{"group_id":"1"} nell’output, il che rende la vostra analisi corretta: il mio server non vede/elabora correttamente -F 'params={\"group_id\":\"1\"}'.

Ora che vedo i passaggi dettagliati del vostro ragionamento, ha perfettamente senso perché abbiate presunto l’errore di sintassi (vorrei poter leggervi nel pensiero prima che pubblicassi :blush:). Ma dato che ho usato la sintassi esatta che avete usato voi, non può essere un errore di sintassi ora, giusto?

Il server è sull’ultima build. Cosa pensate possa essere il problema?

[Edit]: ho provato questo su un altro server di installazione standalone standard 2.9.0.beta3 (8040b95e8c) con lo stesso problema. Il primo server è su 2.9.0.beta3 (0f7b9878ff)

A meno che non si tratti di uno strano problema di curl, non so più cosa pensare.

curl 7.79.1 (Windows) libcurl/7.79.1 Schannel
Release-Date: 2021-09-22
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
2 Mi Piace

Windows non comprende quelle virgolette singole. Quindi dovrai usare virgolette doppie normali e sfuggirle con barre rovesciate.

Usa questo:

-F params={"group_id":"1"}

(Non copiare e incollare questo perché iOS ha rovinato le virgolette)

3 Mi Piace

Ora mi sento proprio un sciocco :rofl:

Grazie Michael, sei veramente all’altezza del tuo titolo! Non dubiterò più di te.

4 Mi Piace

Non l’ho fatto. Se stai dicendo che l’OP è sbagliato, allora il mio commento è inutile. Mi dispiace.

Oh, e ora vedo la risposta di Michael. In effetti, ottenere citazioni e scappatoie corrette è un milione di volte più difficile di quanto si possa pensare.

2 Mi Piace

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.