¿Cuál es el método HTTP correcto para la votación?

8

Desde el punto de vista RESTful , ¿cuál es el método HTTP más apropiado para la acción de upvoting una publicación del foro (como en StackExchange)?

Diría POST para votar y DELETE para cancelar el voto, pero dado que los usuarios solo pueden emitir un voto por mensaje, la votación puede considerarse una operación idempotente , por lo que PUT también puede ser posible.

lortabac
fuente

Respuestas:

6

PUT / posts / 323223 / votos

Un voto puede ser visto como un recurso. Intentaría eso. No haría ninguna acción contra la publicación (/ posts / 323223) ya que es otro recurso. Entonces necesitarías tener un método adicional y comenzará a complicarse.

Luc Franken
fuente
7

Te diría PUTtu voto, o DELETEeso. En realidad, no edita la publicación del foro, por POSTlo que sería inapropiado.

Bruno Schäpper
fuente
1

Depende principalmente de lo que consideres que es tu objeto objetivo real .

Si su objeto objetivo es el voto , entonces probablemente debería PUBLICAR el voto en el sistema porque realmente está cambiando el estado de su objeto objetivo (su contador de votos interno).

A pesar de esto, es mucho más probable que considere la publicación del foro como el objetivo de su operación y, en este caso, lo más probable es que un conjunto de operaciones PUT / DELETE sea más consistente con la filosofía REST porque no está cambiando / editando tu publicación en el foro Simplemente está poniendo / eliminando un token en un contador. Por lo tanto, apoyaría la sugerencia de Vain Fellowman.

El hecho de que votar sea una operación idempotente es otra pista que debería guiarlo en esta dirección. Piense en esto como una operación ADD / REMOVE sobre la variable miembro "vote" de su clase / objeto "forumPost".

Con respecto a cómo saber si su objetivo real es la publicación del foro o la votación, creo que debería mirar su código. El "objeto" (tal vez una página JSP + un controlador Java + alguna entidad Java que se refiere a alguna tabla de base de datos) que recibe y maneja esta solicitud HTTP representa una publicación en el foro o un voto.

AlexBottoni
fuente