Часть 1️⃣
Конечно, утренний опрос был с подвохом 😬. Давайте разбираться
Как правило, метод DELETE в REST API реализовывается без тела запроса. А над каким объектом совершаем действие указываем в URI.
DELETE /resource/{id}❓Что говорят стандарты❓
😮💨 В диссертации Роя Филдинга (родоначальника REST API) я нашла главу про REST на HTTP, но отдельные методы он подробно не разбирает.
😮💨 В стандарте по семантике HTTP (RFC9110, раздел 9.3.5) указывается, что тело у DELETE может быть. 🤪Но с пометкой, что семантика не регламентирована, поэтому нет гарантий, что оно будет обработано. Более того, некоторые серверы могут такой запрос отклонить из-за рисков атак.
😮💨 В OpenAPI 2.0 тело запроса не предусмотрено. Сколько раз на меня ругались линтеры не хочется вспоминать. Но вот уже в 3.0 такая возможность есть. Хотя и с пометкой возможного отклонение сервисами.
😎 Таким образом получается, что тело в DELETE вполне может быть. Вопрос только зачем?! 😎
😊 Множественное удаление 😊
Вполне возможно, что вместо 100 вызовов, типа
DELETE /items/{id} вам будет удобнее делать один
DELETE /items
{
"id": [1, 2, 3, 4]
}
😊 Удаление связей или под-ресурсов 😊
Когда в выбранном объекте нужно удалить, какую то его часть.
У Spotify есть отличный пример: удаление треков из плейлиста. + интересная работа со Snapshot.
DELETE /playlists/{playlist_id}/tracks
{
"tracks": [
{ "uri": "string" }
],
"snapshot_id": "string"
}😂Удаление с условиями😂
Когда удаление, должно произойти, только если выполнилось некоторое условие. Я о таком читала только в книге, поэтому если сталкивались на практике поделитесь.
Ну а мне нравится, как ElasticSearch решают эту задачу без использования тела запроса
😂Подпись на удаление😂
Как подтверждение. что есть права на такую операцию. Такие исключительные условия, когда не достаточно быть под учёткой с нужными правами.
DELETE /api/v3/userDataStream
{ "signature": "base64(hmac_sha256(secret, payload))" }
На практике тоже не встречала, но видела интересное обсуждение на форуме. В реальности, такой пример более «REST-канонично» можно реализовать, например как Binance.
Вероятно, могут быть другие кейсы. Я на практике использовала и встречала только 1 и 2. Поэтому если у вас есть такие из реальной практике поделитесь в комментариях 👀
Таким образом тело запроса у DELETE может быть, но важно понимать зачем это нужно, почему не подходят альтернативы, и какие риски это несет.
Как раз о рисках я расскажу в следующей части.
#СистемныйАнализ #интеграции #RESTAPI #OPENAPI