Чи розумно для REST-ресурсів бути однини та множини?


10

Мені було цікаво, чи не традиційний макет на зразок цього:

api/Products
GET // gets product(s) by id
PUT // updates product(s) by id
DELETE // deletes (product(s) by id
POST // creates product(s)

Чи було б корисніше однини та множини, наприклад:

api/Product
GET // gets a product by id
PUT // updates a product by id
DELETE // deletes a product by id
POST // creates a product

api/Products
GET // gets a collection of products by id
PUT // updates a collection of products by id
DELETE // deletes a collection of products (not the products themselves)
POST // creates a collection of products based on filter parameters passed

Отже, для створення колекції продуктів ви можете:

POST api/Products {data: filters} // returns api/Products/<id>

І тоді, для посилання на нього, ви можете зробити:

GET api/Products/<id> // returns array of products

На мою думку, головна перевага таких способів полягає в тому, що це дозволяє легко кешувати колекції продуктів. Наприклад, можна покласти на колекцію продуктів цілу годину, тим самим різко скоротивши дзвінки на сервері. Звичайно, в даний час я бачу лише гарну сторону того, щоб робити справи таким чином, у чому мінус?

Відповіді:


6

Часто, коли колекція буде найкориснішим способом взаємодії з вашими api, може бути простіше просто уявити одну як колекцію лише з одним членом. Тоді, якщо пізніше ви хочете розкрити API для взаємодії з синглами, йому просто потрібно під обкладинками перетворити єдиний, переданий в колекцію з цим членом, і тоді він використовує ідентичну реалізацію іншого API.

Я думаю, що я тут говорю, якщо ви хочете, щоб колекції були механізмом взаємодії, почніть з API лише колекції, і після завершення системи інший API - це простий допоміжний додаток на рівні інтерфейсу, який ви можете додати, якщо ви вважаєте це особливо корисним. Однак ви можете виявити, що корисність є мінімальною, щоб застосувати YAGNI і просто використовувати інтерфейс колекцій для кількох потрібних вам синглів.


Хоча я погоджуюся з вашими настроями, припускаючи, що ми використовуємо приклад вище, враховуючи, що POST api / Products буде використовуватися для передачі параметрів фільтру колекції, а не даних для створення нових продуктів, що було б розумним способом створення нового продукту без api / продукт?
Єва

@Evan Чому не можна публікувати в api / Products вставити кілька (або колекцію одного) продуктів? Це здається мені найбільш логічним. Можливо, опублікуйте Продукти / Фільтр для створення фільтрів, або отримайте, якщо вони шукають, а не рекламні завдання.
Джиммі Хоффа

Дякую за розробку, Джиммі. Причиною того, що я не бачив цього способу, було те, що я розглядав у наведеному вище прикладі колекцію як ідентифікований ресурс сам по собі. На бекенді api / Product може бути "Product", а api / Products таким чином "ProductCollection". Однак, після деякого розгляду, я думаю, що може бути просто краще абстрагуватися, що все подалі від API, як у вашій пропозиції ... тепер до справжнього питання, чи їхали ви з тієї вантажної зупинки на шляху до Таїланду, або пішли в багажник машини?
Єва

@Evan, я дам вам два підказки: Чайки.
Джиммі Хоффа

1

Мінус полягає в тому, що програма, що викликає, також повинна плюралізувати ім'я ресурсу, що може бути складним для тих клієнтських мов, які не мають вбудованих механізмів плюралізації. Якщо ви залишите його єдиним, абоненту простіше автоматизувати генерацію коду для своєї або її бібліотеки клієнтів.

Якщо ви хочете пом'якшити це, ви можете генерувати SDK для своєї послуги REST самостійно. Або ви можете бути просто впевнені і мати справу зі скаргами :)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.