Чи слід мати дозвіл на невідомі параметри?


12

Я розробляю API RESTful і стикаюся з проблемою заголовка, перезавантаженою для ясності:

Чи потрібно швидко відмовитися, якщо клієнт надсилає нерозпізнаний параметр? Наприклад,

http://example.com/api/foo?bar=true&paula=bean

У вищесказаному barє допустимим параметром, але paulaне визначений API. Чи я повинен

  • Попередити клієнта про помилку
  • Збій швидко
  • Ігноруйте це

Якщо я попередив клієнта, я можу винести лише попередження для першого параметра, оскільки вони можуть надсилати майже нескінченну кількість, і сервер, мабуть, має кращі справи. Аналогічно, у разі відмови, він би вказав лише перший недійсний параметр як проблему.

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

Чи мають сенс мої аргументи? Чи є прийнята практика щодо таких речей?


На основі невеликого тесту, всі тестовані сайти просто ігнорують невідомі параметри, які я їм постачав.
Барт ван Інген Шенау

@BartvanIngenSchenau Те саме тут. Це добре для веб-сторінок, але я не думаю, що це нормально для API
rath

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

@walpen Це цікавий момент. Використання переорієнтованих URL-адрес api/v1тощо би подбало про це, але воно все ще не дозволяє додаткові оновлення. +1
рат

Там ви можете знайти деякі плюси і мінуси з реальної точки зору: Суворі параметри та ваш API .
Ремек Амброзяк

Відповіді:


12

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

Більш прагматичним підходом може бути ігнорування недійсних парам, але в будь-якому випадку ви не забудьте добре задокументувати поведінку.


1
Як розширення: якщо клієнт надсилає якісь невідомі / лише для читання / застарілі параметри, це означає, що клієнт очікує певної поведінки, яка не буде виконана. А тому виконувати будь-яку дію небезпечно. Тож я згоден, суворо поганий запит
Степан Степанов

Дякую @StepanStepanov, але є філософія "Будь вседозволеним у тому, що ти приймаєш, явно про те, що ти надсилаєш", що лежить в основі більшої частини архітектури Інтернету. Зважаючи на це, я міг легко написати відповідь, прямо протиставляючи ту, яку я вже написав.
RubberDuck

3
Я переглянув це)) І на сторінці закону Постеля також сказано, що "код, який отримує вхід, повинен приймати невідповідні дані, доки сенс зрозумілий". Я думаю, якщо клієнт надсилає нам якийсь невідомий параметр, його значення не може бути зрозумілим. Якщо клієнт надсилає нам застарілий параметр, він зрозумів, він не працюватиме так, як раніше і як очікує клієнт. Якщо клієнт надішле нам параметр лише для читання, він зрозумілий, він не буде записаний так, як хоче клієнт.
Степан Степанов

0

Якщо ви робите публічний API (або api, який буде використовуватися іншою командою), я рекомендую помилку повернення, як запропонував @RubberDuck.

Якщо ваш api буде споживатися лише всередині вашої команди (або лише ви самі), можливо, простіше ігнорувати додаткові поля (наприклад, потрібно менше коду та простіше зробити).

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