`DataExplorer::ValidationError: Parâmetro ausente` ao executar consultas do Data Explorer com [params] via API

Há um bug na API do Discourse ao executar consultas do Data Explorer que contêm parâmetros (ambas as consultas abaixo funcionam como esperado quando executadas pelo navegador).

Seguindo as instruções de Run Data Explorer queries with the Discourse API e usando

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

para executar esta consulta (que tem um parâmetro sem seu valor padrão definido)

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

resulta em um erro: {\"success\":false,\"errors\":[\"DataExplorer::ValidationError: Missing parameter group_id of type int\"]}

Quando uma consulta tem um parâmetro com seu valor padrão definido, a chamada da API é bem-sucedida, mas o resultado é o mesmo independentemente do valor fornecido via -F 'params=

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

e sempre retorna o resultado para o valor padrão do parâmetro: {\"success\":true,\"errors\":[],\"duration\":0.2,\"result_count\":1,\"params\":{},\"columns\":[\"id\",\"name\"],\"default_limit\":1000,\"relations\":{},\"colrender\":{},\"rows\":[[2,\"moderators\"]]}

Qual é o comando completo que você está usando?
Você está fornecendo -X POST e todos os cabeçalhos necessários?

O navegador usa a API. É improvável que você esteja descrevendo um grande “se” no discurso.

O do Como executar consultas do Data Explorer com a API do Discourse completo com -X POST e todos os cabeçalhos necessários.

Isso não é um problema de sintaxe, se você verificar a última linha do OP, verá que o curl retorna um sucesso, é apenas que o resultado está incorreto.

Jay, eu não entendo o significado desta frase. Você por acaso tentou reproduzir o problema usando os exemplos mínimos fornecidos no OP?


@michaeld, @pfaffman
Estou hesitando em escrever esta parte, principalmente porque admiro e respeito sua dedicação e expertise em fornecer suporte gratuito à comunidade, sei que me beneficiei de seus insights em inúmeras ocasiões antes. Mas desta vez tenho a sensação de que nenhum de vocês leu além das primeiras linhas do relatório (sou muito cuidadoso em pesquisar e testar completamente antes de postar na categoria de suporte, e sempre tento incluir passos detalhados de reprodução).

A questão é que, na minha experiência, quando uma solicitação de suporte recebe uma resposta como esta — assumindo um erro do usuário sem tentar reproduzir o problema usando os passos fornecidos (especialmente de membros tão experientes quanto vocês) — o problema real tem menos probabilidade de ser detectado pela equipe do Discourse.

Por outro lado, se sua resposta validasse ou invalidasse os passos de reprodução reais, isso daria peso à reclamação (ou apontaria para alguma outra causa) que provavelmente atrairia a atenção da equipe e levaria à correção eventual.

Eu sei que provavelmente 99% dos casos são apenas usuários que não leram as instruções (eu deveria saber, já passei por isso antes). Mas sabendo disso, provavelmente não deveríamos cometer o mesmo erro tentando responder às questões de suporte rapidamente, em vez de completamente?

Estou surpreso e, para ser honesto, um pouco decepcionado ao ler isso. Eu li seu problema minuciosamente e tive as seguintes observações:

  1. Na verdade, você não forneceu etapas de reprodução completas e detalhadas, pois não incluiu a linha de comando inteira.

  2. O fato de você só obter saída quando define um valor padrão para o parâmetro me leva a acreditar que o Discourse não está vendo seu par nome/valor do parâmetro.

A conclusão de que sua linha de comando deve estar correta porque você obtém saída está errada - e ignora o fato de que você não está obtendo a saída associada ao parâmetro que forneceu, mas sim ao seu valor padrão.

  1. Eu tentei - e não consigo - reproduzir este 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"]]}

Essas três observações me levaram a pedir um detalhe em sua linha de comando, pois eu estava considerando quais circunstâncias levariam o Discourse a não ver o parâmetro, e estou convencido de que esta é uma questão de sintaxe.

Cometer um erro de digitação ou um engano não é algo reservado a usuários inexperientes. Eu cometo erros triviais todos os dias.

3 curtidas

Michael (e Jay), por favor, aceitem minhas desculpas, presumi que vocês não realmente seguiram os passos de reprodução, o que eu não deveria ter feito! Serei mais cuidadoso para não presumir tais coisas no futuro.

Esperando que você ainda esteja disposto a me aturar: usei o mesmo curl que você (na verdade, copiei o seu desta vez, para ter 100% de certeza), com este resultado:

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

e comparando com o seu

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

o problema emerge imediatamente: params\":{} vs \"params\":{\"group_id\":\"1\"} na saída, o que torna sua análise correta: meu servidor não está vendo/processando -F 'params={\"group_id\":\"1\"}' corretamente.

Agora que vejo os passos detalhados do seu raciocínio, faz todo o sentido por que você assumiu o erro de sintaxe (queria poder ler sua mente antes de postar :blush:). Mas como usei a mesma sintaxe que você, não pode ser um erro de sintaxe agora, certo?

O servidor está na última build. O que você acha que pode ser o problema?

[Edit]: Tentei isso em outro servidor de instalação independente padrão 2.9.0.beta3 (8040b95e8c) com o mesmo problema. O primeiro servidor está em 2.9.0.beta3 (0f7b9878ff)

A menos que seja algum problema estranho com o curl, estou perdido.

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 curtidas

O Windows não entende essas aspas simples. Portanto, você terá que usar aspas duplas normais e escapá-las com barras invertidas.

Use isto:

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

(Não copie e cole isto, pois o iOS estragou as aspas)

3 curtidas

Agora me sinto um tolo :rofl:

Obrigado, Michael, você realmente faz jus ao seu título! Não duvidarei mais de você.

4 curtidas

Eu não tentei. Se você está dizendo que o OP está errado, então meu comentário é inútil. Desculpe por isso.

Ah, e agora vejo a resposta do Michael. De fato, acertar as citações e os escapes é um milhão de vezes mais difícil do que se pensaria.

2 curtidas

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