Actualizar una publicación mediante una solicitud PUT de la API

Solo para entender, la documentación de la API de Discourse menciona este tipo de… estructura…

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

Antes de intentarlo, ¿significa esto, o bueno… qué significa esto?

¿Significa esto: {post: {raw: ..., raw_old: ... }}

O simplemente {raw: "", raw_old: ""...}

Y también, ¿qué es raw_old? Solo dice que cada elemento es una “cadena” de lo que debo PUT: en el cuerpo JSON.

Simplemente estoy intentando agregar una línea en la parte superior del post (que fue creado inicialmente por un Bot) donde necesitamos agregar un enlace a otro sitio. Nota también que con el objetivo de que ese primer párrafo se muestre debajo del título de la categoría, o en el elemento cooked

que se mostrará (definido justo debajo del título de la categoría).

Espero que esto tenga sentido. Si no es así, pídamelo aclarar.

En este momento no estoy realmente seguro de para qué sirve raw_old, pero solo necesitas usar el campo raw y reemplazará toda la publicación. Así que, en tu código, obtendrías la publicación que deseas editar, agregarías tu línea al principio y luego actualizarías la publicación usando el campo raw.

Podría ser útil ver cómo lo hace Discourse editando una publicación en vivo en tu sitio e inspeccionando las llamadas del navegador:

Así es como también lo hace la gema discourse_api:

Solo una pregunta al respecto: ¿te refieres a una documentación diferente a la definida en Discourse API Docs? Eso sería interesante… sin embargo, solo me baso en la documentación de la API.

Mi objetivo simple es simplemente agregar un comentario y un enlace debajo del nombre de la categoría, lo cual creo que Discourse toma del primer post del tema “Acerca de…”. Solo estoy buscando saber qué se insertará en el elemento

… o qué necesito hacer para que mi post aparezca allí. ¿Tiene sentido mi explicación?

A partir de lo anterior y de los intentos realizados, no es posible actualizar una publicación usando “cooked” como indica la documentación de la API; sin embargo, sí es posible hacerlo con “raw”. Todos mis intentos usando “cooked” me devolvían un error indicando que mi publicación era inválida porque tenía menos de 20 caracteres o no era una oración clara…

Sin embargo, hay problemas adicionales con “raw” que abordaré en otra publicación, ya que no están directamente relacionados con esto.

Gracias por toda su ayuda.

Hay una ligera discrepancia en la documentación de la API:

La documentación indica: PUT /posts/{id}.json con el siguiente payload:

Tipo de contenido: application/json

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

pero esto solo funciona con PUT /posts/{id} y Content-Type: application/x-www-form-urlencoded.

El payload correcto para PUT /posts/{id}.json debería ser:

Tipo de contenido: application/json

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

El parámetro raw es suficiente para reemplazar toda la publicación.

Sí, gracias, me di cuenta de esto después de intentar algunas solicitudes en Postman y probarlo… también, en mis intentos, “cooked” parecía no hacer nada… y aún no estoy seguro de qué es “raw_old”.

Esto se ha retrasado hoy y se me ha asignado. Quizás se me pueda quitar la asignación :slight_smile:

En cualquier caso, la documentación ahora es correcta: Discourse API Docs.