При разработке Restful API я должен использовать DELETE или POST для UNFOLLOW? - PullRequest
2 голосов
/ 29 сентября 2019

У меня один вопрос на один день, я пытался почитать RESTful Web Services Cookbook и другие сообщения от stackoverflow, но все еще не получил убедительного ответа на этот вопрос:

Предполагая, что яиметь таблицу базы данных, в которой хранятся отношения между двумя пользователями, отношение показывает, что если пользователь A следует за пользователем B (например, в Instagram / Twitter).

userId|userId
------|------
userA | userB
userA | userC
....

Так что теперь, если пользователь A хотел бы отменить подписку пользователя B, тогда этот API должен быть DELETE или POST?

в веб-службах RESTfulНа странице 11 поваренной книги написано:

"Метод DELETE является идемпотентным. Это означает, что сервер должен вернуть код ответа 200 (ОК), даже если сервер удалил ресурс в предыдущем запросе. Но на практике реализация DELETE как идемпотентной операции требует, чтобы сервер отслеживал все удаленные ресурсы. В противном случае он может вернуть 404 (не найдено). "

Предлагает ли это нам не использовать DELETE всякий раз, когда мы можем избежать?

Спасибо за понимание этого вопроса!

Ответы [ 2 ]

2 голосов
/ 29 сентября 2019

Опираясь на Ответ Эверта , метод DELETE подходит для ваших нужд, если у вас есть ресурс, представляющий отношения между двумя пользователями.

Семантика метода DELETE определена в RFC 7231 :

4.3.5. DELETE

Метод DELETE запрашивает, чтобы исходный сервер удалил связь между целевым ресурсом и его текущей функциональностью. [...]

Метод DELETE фактически предназначен для идемпотентности, но ваша цитата в корне неверна , когда она связывает идемпотентность с кодом состояния.

Как я уже упоминал в этом ответе , идемпотентность не связана с самим кодом состояния. Идемпотентность - это эффект , создаваемый состоянием ресурса на сервере, даже если ответ на последующие запросы отличается от первого запроса.

Рассмотримклиент выполняет DELETE запрос на удаление ресурса с сервера. Сервер обрабатывает запрос, ресурс удаляется, а сервер возвращает 204. Затем клиент повторяет тот же запрос DELETE и, поскольку ресурс уже удален, сервер возвращает 404, и это совершенно нормально.

Несмотря на другой код состояния, полученный клиентом, Эффект , создаваемый одним DELETE запросом, - это тот же эффект, что и от нескольких запросов DELETE к одному и тому же URI.

2 голосов
/ 29 сентября 2019

DELETE - для удаления определенных ресурсов. Таким образом, если DELETE подходит для вас, зависит от того, есть ли у вас один ресурс, который «представляет» следующие отношения между двумя пользователями.

Например, если у вас есть такой ресурс:

/api/userA/follows/userB

Тогда можно сказать, что этот ресурс представляет отношения между ними. У него есть уникальный URL-адрес, поэтому этот URL-адрес можно удалить, и в этот момент я ожидаю, что отношения будут разорваны.

...