2013-03-04 3 views
9

Я создаю команду API RESTful для деактивации записи пользователя. Кошерно ли использовать DELETE для этого или должно быть PUT, так как запись обновляется до состояния «деактивирована»? Или это просто вопрос вкуса?Можно ли использовать DELETE для дезактивации записи?

ответ

8

Семантика DELETE означает, что вы фактически избавляетесь от объекта. То, что вы делаете здесь, похоже на изменение состояния объекта. В этом случае более подходящим будет PUT или PATCH.

Лучше придерживаться семантики единого интерфейса, который вы используете (в данном случае, HTTP-глаголов). Если они соответствуют тому, что вы на самом деле делаете в своем приложении, тогда возникает меньше путаницы. Кроме того, что, если позже вы решите, что DELETE должен фактически удалить запись, а не просто отметить ее «неактивным»? Теперь вы изменили поведение своего API. Кроме того, если вы используете DELETE, вы по существу следуете принципу наименьшего удивления, который хорош для API. Лучше иметь DELETE на самом деле сделать удаление, а не просто притворяться.

С другой стороны, это прекрасная возможность удалить запись из одного места и переместить ее в другое место (например, из одной таблицы в другую), если окажется, что вы обязаны хранить данные в исторических целях. В этом случае эта запись должна просто оставаться недоступной для будущих операций (то есть, GET на ресурсе должна вернуть).

+0

Просто небольшой добавкой: Согласно [RFC-2616] (http://tools.ietf.org/html/rfc2616#section-9.7) сервер также может перемещать ресурс в недоступное место. В конце 'GET' на удаленном ресурсе должен вернуть' 404' – prehfeldt

+0

@prehfeldt Исправить! Я упомянул об этом в моем последнем абзаце. Добавлен бит о '404' для дополнительного уточнения. –

4

Если после операции деактивации ресурс недоступен для конечного пользователя больше через «GET», если он не повторно активирован, я не вижу проблемы с использованием «УДАЛИТЬ». В противном случае «PUT» является более подходящим.

3

Если ресурс по URL-адресу, который вы отправляете, DELETE запрос больше не доступен при наличии этого URI, тогда DELETE подходит. Если он остается там, но меняет состояние, то это не так.

например. это нормально (ресурс в/друзей/боб уходит, новый ресурс создан в/formerfriends/боб в этом процессе, но это случайно):

GET /friends/bob => 200 OK 
GET /formerfriends/bob => 404 Not Found 
DELETE /friends/bob => 204 No Content 
GET /friends/bob => 410 Gone 
GET /formerfriends/bob => 200 OK 

это не так:

GET /friends/bob => 200 OK {"status"="friend"} 
DELETE /friends/bob => 204 No Content 
GET /friends/bob => 200 OK {"status"="formerfriend"} 

что-то подобное, что было бы лучше обращаться с PUT или PATCH:

GET /friends/bob => 200 OK {"status"="friend"} 
PATCH /friends/bob {"status"="formerfriend"} => 204 No Content 
GET /friends/bob => 200 OK {"status"="formerfriend"} 
Смежные вопросы