DataExplorer::ValidationError: Missing parameter при выполнении запросов Data Explorer с [params] через API

В Discourse API обнаружена ошибка при выполнении запросов Data Explorer, содержащих параметры (оба запроса ниже работают корректно при запуске из браузера).

Следуя инструкциям с Run Data Explorer queries with the Discourse API и используя

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

для выполнения этого запроса (у которого параметр задан без значения по умолчанию)

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

возникает ошибка: {"success":false,"errors":["DataExplorer::ValidationError: Missing parameter group_id of type int"]}.

Если в запросе параметр имеет значение по умолчанию, вызов API выполняется успешно, но результат остаётся одинаковым независимо от значения, переданного через -F 'params=.

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

Всегда возвращается результат для значения по умолчанию параметра: {"success":true,"errors":[],"duration":0.2,"result_count":1,"params":{},"columns":["id","name"],"default_limit":1000,"relations":{},"colrender":{},"rows":[[2,"moderators"]]}.

Какую полную команду вы используете?
Предоставляете ли вы -X POST и все необходимые заголовки?

Браузер использует API. Маловероятно, что вы описываете крупный инцидент в обсуждении.

Та, что в статье Как выполнять запросы Data Explorer с помощью API Discourse, полностью с -X POST и всеми требуемыми заголовками.

Это не проблема синтаксиса: если вы посмотрите последнюю строку в исходном сообщении, то увидите, что curl возвращает успех, просто результат некорректен.

Джей, я не понимаю смысла этого предложения. Не пробовали ли вы случайно воспроизвести проблему, используя минимальные примеры из исходного сообщения?


@michaeld, @pfaffman
Я колеблюсь писать эту часть, в основном потому, что восхищаюсь и уважаю вашу преданность и экспертизу в предоставлении бесплатной поддержки сообществу; я знаю, что не раз получал пользу от ваших советов. Но на этот раз у меня есть ощущение, что ни один из вас не дочитал до конца первые несколько строк отчёта (я очень тщательно исследую и тестирую перед публикацией в категории поддержки и всегда стараюсь включать подробные шаги воспроизведения).

Дело в том, что, по моему опыту, когда запрос на поддержку получает ответ вроде этого — предполагается ошибка пользователя без попытки фактически воспроизвести проблему с использованием предоставленных шагов (особенно от таких опытных участников, как вы) — реальная проблема с меньшей вероятностью будет замечена командой Discourse.

С другой стороны, если ваш ответ либо подтвердит, либо опровергнет фактические шаги воспроизведения, это придаст вес утверждению (или укажет на другую причину), что с большей вероятностью привлечёт внимание команды и приведёт к eventual исправлению.

Я знаю, что, вероятно, в 99% случаев пользователи просто не читают инструкции (я сам через это проходил). Но, зная это, не стоит ли нам избегать повторения той же ошибки, пытаясь отвечать на запросы поддержки быстро, а не тщательно?

Я удивлён и, честно говоря, немного разочарован, прочитав это. Я очень внимательно изучил ваш вопрос и сделал следующие наблюдения:

  1. Вы действительно не предоставили полные и подробные шаги для воспроизведения, так как не указали всю команду целиком.

  2. Тот факт, что вывод появляется только при установке значения по умолчанию для параметра, заставляет меня предположить, что Discourse не видит вашу пару имя/значение параметра.

Вывод о том, что ваша команда должна быть верной, потому что вы получаете вывод, ошибочен — он игнорирует тот факт, что вы получаете вывод, связанный не с предоставленным вами параметром, а со значением по умолчанию.

  1. Я пытался воспроизвести эту проблему, но у меня не вышло.
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"]]}

Эти три наблюдения побудили меня попросить вас уточнить детали вашей команды, поскольку я рассматривал, при каких обстоятельствах Discourse может не видеть параметр, и убеждён, что это действительно проблема синтаксиса.

Допускать опечатки или ошибки — это не удел только неопытных пользователей. Я совершаю мелкие ошибки каждый день.

Майкл (и Джей), примите мои извинения. Я предположил, что вы на самом деле не выполняли шаги воспроизведения, чего мне не следовало делать! В будущем я буду более внимательным и не буду делать подобных предположений.

Надеюсь, вы всё ещё готовы проявить терпение: я использовал точно такую же команду curl, что и вы (на этот раз я даже скопировал вашу, чтобы быть на 100% уверенным), и вот результат:

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

Сравнивая это с вашим результатом:

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

проблема сразу становится очевидной: params":{} против "params":{"group_id":"1"} в выводе. Это подтверждает правильность вашего анализа: мой сервер не видит/не обрабатывает -F 'params={"group_id":"1"}' корректно.

Теперь, когда я вижу подробные шаги вашего рассуждения, совершенно понятно, почему вы предположили ошибку синтаксиса (хотел бы я уметь читать ваши мысли до того, как я опубликовал сообщение :blush:). Но раз я использовал точно такой же синтаксис, как и вы, значит, сейчас это не может быть ошибкой синтаксиса, верно?

Сервер работает на последней сборке. Как вы думаете, в чём может быть проблема?

[Edit]: попробовал это на другом стандартном сервере с автономной установкой версии 2.9.0.beta3 (8040b95e8c), и проблема осталась та же. Первый сервер работает на версии 2.9.0.beta3 (0f7b9878ff).

Если это не какая-то странная проблема с curl, то я в тупике.

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

Windows не понимает одинарные кавычки. Поэтому вам придется использовать обычные двойные кавычки и экранировать их обратными слешами.

Используйте это:

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

(Не копируйте и не вставляйте этот пример, так как в iOS кавычки были искажены)

Ну и чувствую себя теперь полным дураком :rofl:

Спасибо, Майкл, ты действительно заслуживаешь свой титул! Больше я в тебе не сомневаюсь.

Я не пробовал. Если вы утверждаете, что автор исходного поста ошибается, то мой комментарий был бесполезен. Извините за это.

О, и теперь я вижу ответ Майкла. Действительно, правильно расставить кавычки и экранирующие символы в миллионы раз сложнее, чем можно подумать.