Обновление поста через API PUT-запрос

Просто для уточнения: в документации API Discourse упоминается такая… структура…

{
"post[raw]": "string",
"post[raw_old]": "string",
"post[edit_reason]": "string",
"post[cooked]": "string"
}

Прежде чем я попробую это сделать, что это означает? Или, точнее, что именно это значит?

Означает ли это: {post: {raw: ..., raw_old: ... }}

Или просто {raw: "", raw_old: ""...}?

Также что такое raw_old? Указано лишь, что каждый элемент — это «строка», которую нужно передать в теле JSON при выполнении PUT-запроса.

Я просто пытаюсь добавить строку в начало поста (который изначально был создан ботом), где нам нужно добавить ссылку на другой сайт. Также заметьте, что наша цель — отобразить этот первый абзац под заголовком категории или в элементе cooked

, который показывается (определён сразу под заголовком категории).

Надеюсь, всё понятно. Если нет — попросите меня уточнить.

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

Может быть полезно посмотреть, как это делает Discourse: отредактируйте пост в реальном времени на вашем сайте и изучите вызовы браузера:

Именно так работает и gem discourse_api:

Вопрос по этому поводу: вы имеете в виду другую документацию, чем та, что определена по адресу Discourse API Docs? Это было бы интересно… однако я руководствуюсь только документацией по API.

Моя простая цель — просто добавить комментарий и ссылку под названием категории, что, как я полагаю, Discourse берет из первого поста темы «О…». Я просто хочу понять, что будет вставлено в элемент

… или что мне нужно сделать, чтобы мой пост появился там. Имеет ли смысл моё объяснение?

Из вышеизложенного и из моих попыток следует, что обновить пост с использованием параметра «cooked», как указано в документации API, невозможно. Однако это можно сделать с помощью параметра «raw». Все мои попытки использовать «cooked» приводили к ошибке, указывающей на недопустимость поста: он либо был короче 20 символов, либо не представлял собой чёткое предложение…

Однако с параметром «raw» есть и дополнительные проблемы, которые я опишу в отдельном посте, так как они не имеют прямого отношения к данной теме.

Спасибо за всю вашу помощь.

В документации API есть небольшое расхождение:

В документации указано: PUT /posts/{id}.json с полезной нагрузкой

Тип содержимого: application/json

{
  "post[raw]": "string",
  "post[raw_old]": "string",
  "post[edit_reason]": "string",
  "post[cooked]": "string"
}

однако это работает только с PUT /posts/{id} и Content-Type: application/x-www-form-urlencoded.

Правильная полезная нагрузка для PUT /posts/{id}.json должна быть следующей:

Тип содержимого: application/json

{
  "post": {
      "raw": "string",
      "raw_old": "string",
      "edit_reason": "string",
      "cooked": "string"
    }
}

Параметра raw достаточно для полной замены поста.

Да, спасибо, я понял это после нескольких попыток запросов через Postman и экспериментов… Также в моих попытках параметр “cooked”, похоже, ничего не делал… и я до сих пор не уверен, что такое “raw_old”.

Это было поднято сегодня и назначено мне. Возможно, его можно снять с назначения :slight_smile:

В любом случае, документация теперь верна: https://docs.discourse.org/#tag/Posts/operation/updatePost.