Чи повинен API RESTful надавати дані для всієї форми?


13

Скажімо, у мене є веб-додаток JavaScript, який повністю використовує API RESTful для даних.

Скажімо, у цій програмі є форма даних, і скажімо, що я редагую запис за адресою / product / 12345. Створюючи форму, я роблю запит RESTful на / product / 12345 і отримую дані JSON:

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27
}

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

Чи має сенс зробити це частиною відповіді на запит / product / 12345?

{
  "id": 12345,
  "name": "Some Product",
  "active": true,
  "sales_user_id": 27,
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ]
}

А як щодо створення нового запису? Чи повинен мій API також відповідати GET / product / new, із наступним?

{
  "sales_users": [
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
  ],
  "categories": [
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
  ],
  "etc": [ ... ]
}

будь ласка, ніколи не використовуйте GET-запит, щоб щось створити. Кінцевою точкою має бути / продукт не / продукт / новий . Щоб створити новий продукт, вам слід надіслати запит PUT до цієї кінцевої точки.
Керем Байдоган

Це нічого не створює. Це суто запит на наявні дані або шаблон для нової, ще не збереженої записи.
Чад Джонсон

о, вибачте, зараз я бачу, що ти маєш на увазі. будь-який спосіб кінцевої точки продукту не повинен нести відповідальність за надання шаблонного продукту або списку значень для спадних форм форми створення продукту. як говорить @Dan, просто створіть окремі кінцеві точки та використовуйте заголовки кешування, щоб ваш веб-переглядач міг кешувати спадні значення для продуктивності.
Керем Байдоган

Відповіді:


6

Я схиляюся до дуже простих, вузько зосереджених кінцевих точок. Я б очікував запиту в такому місці, як / sales_users, який повертає всіх користувачів продажів.

GET / sales_users:

[
    {"id": 1, "name": "Anna Graham"},
    {"id": 2, "name": "Dick Mussell"},
    {"id": 3, "name": "Ford Parker"},
    {"id": 4, "name": "Ferris Wheeler"},
    {"id": 5, "name": "Jo King"}
]

Так само, якщо ви будете мати список категорій, я б додав для цього окрему кінцеву точку.

Отримати / категорії:

[
    {"id": 1, "name": "Category 1"},
    {"id": 2, "name": "Category 2"},
    {"id": 3, "name": "Category 3"},
    {"id": 4, "name": "Category 4"},
    {"id": 5, "name": "Category 5"}
]

Я б не будував GET / продукт / новий. Швидше, я б створив форму у вашому додатку для обробки додавання нових продуктів, які знають відповідні запити для заповнення його списків (наприклад, GET / категорії, GET / sales_users тощо).


3

Якщо припустити, що список продавців відносно статичний, я б подумав, що вам потрібно окремий дзвінок API, /salesusersякий ви могли б зателефонувати один раз (під час завантаження форми тощо) та зберегти, щоб не потрібно повторно запитувати ці дані час. Пам'ятайте, що в REST ви організовуєте свій API навколо ресурсів, а продавці логічно відокремлюють ресурси від продуктів.

Крім того, під час дзвінка /product/newви хочете лише надсилати дані для нового продукту, який може містити ідентифікатор sales_user, але нічого більше. Зміни самого продавця-продавця будуть окремим дзвінком.

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