Одной из причин использования тела в запросе на удаление является оптимистический контроль параллелизма.
Вы читаете версию 1 записи.
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
Ваш коллега читает версию 1 записи.
GET /some-resource/1
200 OK { id:1, status:"unimportant", version:1 }
Ваш коллега меняет запись и обновляет базу данных, которая обновляет версию до 2:
PUT /some-resource/1 { id:1, status:"important", version:1 }
200 OK { id:1, status:"important", version:2 }
Вы пытаетесь удалить запись:
DELETE /some-resource/1 { id:1, version:1 }
409 Conflict
Вы должны получить исключение оптимистической блокировки. Перечитайте запись, убедитесь, что она важна, и, возможно, не удалите ее.
Другая причина его использования - удаление нескольких записей одновременно (например, сетка с флажками выбора строк).
DELETE /messages
[{id:1, version:2},
{id:99, version:3}]
204 No Content
Обратите внимание, что каждое сообщение имеет свою версию. Может быть, вы можете указать несколько версий, используя несколько заголовков, но Джордж, это проще и гораздо удобнее.
Это работает в Tomcat (7.0.52) и Spring MVC (4.05), возможно, с более ранними версиями:
@RestController
public class TestController {
@RequestMapping(value="/echo-delete", method = RequestMethod.DELETE)
SomeBean echoDelete(@RequestBody SomeBean someBean) {
return someBean;
}
}