Поисковик данных Discourse: SQL-запрос

У меня есть вопрос, очень похожий (но не идентичный) на вопрос, опубликованный здесь: `DataExplorer::ValidationError: Missing parameter` when running Data Explorer queries with [params] via API.

Мой запрос в Data Explorer выглядит так:

-- [params]
-- topic_id :topic_id

SELECT * FROM posts WHERE topic_id = :topic_id

Это работает корректно в Data Explorer. Однако при попытке запустить его через API я получаю ошибку:

{"success":false,"errors":["DiscourseDataExplorer::ValidationError: Missing parameter topic_id of type topic_id"]}'

Вот мой запрос на Python:


headers = {
    'Content-Type': 'multipart/form-data;',
    'Api-Key': API_KEY,
    'Api-Username': USERNAME_SYSTEM
}

params = {"topic_id": 398}

response = requests.post(url="[REDACTED]/admin/plugins/explorer/queries/10/run", headers=headers, params=params)

Из ошибки я делаю вывод, что нельзя передавать “topic_id” как строку, но не понимаю, как иначе передать его в качестве ключа. Есть какие-либо идеи?

Параметры не передаются в URL.

Может быть, что-то вроде: data={"params": '{"topic_id":"398"}'}?

Мне пришлось перепробовать множество различных вариантов, но этот сработал:

                         headers=headers, data={'params': '{\"topic_id\": "398"}'})```

Итак, ответ представляет собой комбинацию предыдущего поста (в котором говорилось, что нужно экранировать кавычки при отправке с компьютера под управлением Windows) и поста Arkshine, где указано, что данные должны передаваться как аргумент data, а не как именованный аргумент params. Однако меня удивляет следующее: я думал, что вся суть именованного аргумента params в модуле requests для Python заключается именно в передаче информации о параметрах.

Рад, что всё сработало!

Я пробовал отправлять с Linux (WSL) или Windows — у меня такой проблемы не возникло, и в обоих случаях всё работало. :thinking:

data = {
    'params': '{"topic_id": "3"}'
}

response = requests.post(
    url="http://localhost:4200/admin/plugins/explorer/queries/4/run", 
    headers=headers, 
    data=data
)

image