Ошибка 404 при использовании Gem DiscourseAPI для генерации API-ключа пользователя

Привет!

Я уже долгое время пытаюсь найти решение этой проблемы и надеюсь, что кто-то здесь сможет помочь. Недавно я присоединился к новому проекту и взял на себя обязанности предыдущего разработчика. Недавно я обновил сборку Discourse до последней версии — она отставала на несколько месяцев — и все остальные функции и вызовы API работают как ожидалось.

Моя задача — использовать API для создания темы в Discourse с нашего внешнего сайта. Я беру ID пользователя, нахожу его в Discourse с помощью метода DiscourseAPI by_external_id. После этого вызываю generate_user_api_key(discourse_user[‘id’]), передавая ID пользователя из Discourse.

В ответ я получаю ошибку DiscourseApi::NotFoundError / 404, которая появилась только после обновления.

Буду очень признателен за любую помощь или совет!

Маршрут для генерации API-ключей изменился, но метод в gem Discourse API, используемый для генерации API-ключа, всё ещё обращается к старому маршруту. Вот почему вы получаете ошибку 404.

Мы исправим это. На данный момент, если вам нужно сгенерировать API-ключ для пользователя, вы можете сделать это, отправив POST-запрос на http://localhost:3000/admin/api/keys. Вот пример запроса CURL. В примере я заменил свой реальный API-ключ на $api_key:

curl -X POST "http://localhost:3000/admin/api/keys" \
-H "Content-Type: multipart/form-data;" \
-H "Api-Key: $api_key" \
-H "Api-Username: system" \
-F "key[description]=ключ для bobby" \
-F "key[username]=bobby"

Для этого не нужно генерировать пользовательский API-ключ. Вместо этого вы можете установить client.api_username в имя пользователя, от имени которого нужно опубликовать пост:

client.api_username = "susan"
client.create_topic(category: 5, title: "Супер крутая API-тема от Susan", skip_validation: true, raw: "это тест, это только тест")

client.api_username = "bobby"
client.create_topic(category: 5, title: "Супер крутая API-тема от Bobby", skip_validation: true, raw: "это тест, это только тест")

Это будет работать корректно, если при создании client вы использовали API-ключ «Все пользователи».

Спасибо!

Я обновил свой код, чтобы использовать ключ «Все пользователи» вместо генерации отдельного ключа для каждого пользователя, и передал имя пользователя как api_username. Это помогло решить проблему.