Я думаю, що для цього можна використовувати метод POST або PATCH, оскільки вони зазвичай для цього розробляють.
Використання POST
методу зазвичай використовується для додавання елемента, коли він використовується на ресурсі списку, але ви також можете підтримувати кілька дій для цього методу. Дивіться цю відповідь: Як оновити колекцію ресурсів REST . Ви також можете підтримувати різні формати представлення для вхідних даних (якщо вони відповідають масиву або окремим елементам).
У цьому випадку не потрібно визначати свій формат для опису оновлення.
Використання PATCH
методу також підходить, оскільки відповідні запити відповідають частковому оновленню. Відповідно до RFC5789 ( http://tools.ietf.org/html/rfc5789 ):
Деякі програми, що розширюють протокол передачі гіпертексту (HTTP), потребують функції для часткової модифікації ресурсів. Існуючий метод HTTP PUT дозволяє лише повну заміну документа. Ця пропозиція додає новий метод HTTP, PATCH, для зміни існуючого ресурсу HTTP.
У цьому випадку вам потрібно визначити свій формат для опису часткового оновлення.
Я думаю , що в цьому випадку, POST
і PATCH
дуже схожі , так як вам не потрібно , щоб описати операцію зробити для кожного елемента. Я б сказав, що це залежить від формату подання, яке надсилається.
Справа PUT
дещо менш зрозуміла. Насправді, використовуючи метод PUT
, ви повинні надати цілий список. По суті, подане подання у запиті буде заміною ресурсного списку.
Ви можете мати два варіанти щодо шляхів використання ресурсів.
- Використання шляху ресурсу для списку документів
У цьому випадку вам потрібно чітко вказати посилання на документи із підшивкою у поданні, яке ви надаєте у запиті.
Ось зразок маршруту для цього /docs
.
Зміст такого підходу може бути для методу POST
:
[
{ "doc_number": 1, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 2, "binder": 4, (other fields in the case of creation) },
{ "doc_number": 3, "binder": 5, (other fields in the case of creation) },
(...)
]
- Використання підресурсного шляху елемента підшивки
На додаток, ви також можете розглянути можливість використання підмаршрутів для опису зв'язку між документами та в'яжучими. Підказки щодо асоціації між документом та підшивкою тепер не повинні вказуватися у змісті запиту.
Ось зразок маршруту для цього /binder/{binderId}/docs
. У цьому випадку надсилання списку документів із методом POST
або PATCH
додавання документів до підшивки з ідентифікатором binderId
після створення документа, якщо він не існує.
Зміст такого підходу може бути для методу POST
:
[
{ "doc_number": 1, (other fields in the case of creation) },
{ "doc_number": 2, (other fields in the case of creation) },
{ "doc_number": 3, (other fields in the case of creation) },
(...)
]
Щодо відповіді, то вам вирішувати рівень відповіді та помилки, які потрібно повернути. Я бачу два рівні: рівень статусу (глобальний рівень) і рівень корисного навантаження (тонший рівень). Також від вас залежить, чи всі вставки / оновлення, що відповідають вашому запиту, мають бути атомними чи ні.
У цьому випадку ви можете використовувати статус HTTP. Якщо все піде добре, ви отримаєте статус 200
. Якщо ні, інший статус, наприклад, 400
якщо надані дані неправильні (наприклад, ідентифікатор підшивки не дійсний) або щось інше.
У цьому випадку 200
буде повернуто статус , і опис того, що було зроблено, і де в кінцевому підсумку виникають помилки, залежить від подання відповіді. ElasticSearch має кінцеву точку в своєму REST API для масового оновлення. Це може дати вам кілька ідей на цьому рівні: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/bulk.html .
Ви також можете реалізувати асинхронну обробку для обробки наданих даних. У цьому випадку повернеться статус HTTP 202
. Клієнту потрібно отримати додатковий ресурс, щоб побачити, що відбувається.
Перш ніж закінчити, я також хотів би помітити, що специфікація OData вирішує проблему, що стосується відносин між сутностями з функцією з іменем навігаційних посилань . Можливо, ви могли б поглянути на це ;-)
Наступне посилання також може вам допомогти: https://templth.wordpress.com/2014/12/15/designing-a-web-api/ .
Сподіваюся, це допоможе тобі, Тьєррі
GET /docs
і отримати всі документи в межах певного сполучногоGET /docs?binder_id=x
. Щоб видалити підмножину ресурсів, я би зателефонувавDELETE /docs?binder_id=x
або мені слід зателефонуватиDELETE /docs
за допомогою{"binder_id": x}
телу запиту? Чи могли б ви коли-небудь використовуватиPATCH /docs?binder_id=x
для пакетного оновлення або простоPATCH /docs
передавати пари?