Похоже, что PUT
подойдет вашей задаче лучше, чем GET
, просто потому, что GET
не должен изменять состояние на сервере.
From RF C 2616 :
Метод GET означает получение любой информации (в форме объекта), идентифицируемой Request-URI
Также оттуда:
Безопасные методы: В частности, было установлено, что методы GET и HEAD НЕ ДОЛЖНЫ иметь значение выполнения каких-либо действий, кроме извлечения. Эти методы следует считать «безопасными».
С другой стороны, для PUT:
Метод PUT запрашивает, чтобы закрытый объект был сохранен в предоставленном Request- URI. Если Request-URI относится к уже существующему ресурсу , закрытый объект ДОЛЖЕН рассматриваться как модифицированная версия того, который находится на исходном сервере.
Кажется, что он подходит хорошо, поскольку есть упоминание о возможности того, что какой-то ресурс уже существует, и мы, вероятно, не хотим создавать его снова. PUT
также считается идемпотентным.
Теперь представьте, что в таблице будет еще один столбец: user_tasks (user_id, task_id, position). Какое здесь лучшее решение?
Лучшее решение во всем - выбрать подход, который лучше всего подходит вам и пользователям API. Единственным возможным недостатком здесь может быть то, что одна из двух упомянутых схем не похожа на другие схемы в API, и некоторые пользователи могут найти ее неожиданной.
Лично я бы go с PUT users/{user_id}/tasks/{task_id}/assign?position=3
или с вашим подход, при котором параметры передаются через полезную нагрузку. Я думаю, что URI должен быть каким-то идентифицируемым ресурсом, тогда как user_tasks
на него не похож. Это похоже на название действия, которое обычно можно увидеть в конце URI, например, посмотрите как Twitter это сделал.