Для чого правильний код статусу HTTP: "Ця версія цього API була припинена"?


13

У мене є RESTful API. Існує 3 його версії: v1, v2 та v3. Я збираюся опублікувати v4, і ми вирішили припинити v1, це означає, що всі прохання http://example.com/v1/resourceпровалитимуться, але дзвінки до http://example.com/v2/resourceпродовжуватимуть працювати.

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

Я також розглядав загальний 400код статусу, але це теж здавалося дивним. Чи є стандартна відповідь на це?


Немає коду статусу HTTP для відмови API, оскільки API не мають нічого спільного з HTTP. Ви кажете, ресурс все ще доступний, але його потрібно запитувати по-іншому, тоді як в REST це не той самий ресурс, так що ні, він недоступний.
Роб

Відповіді:


11

Здається, це не стандарт.

У StackOverflow відповідь нахиляється до 410 GONE, але я думаю , що 301 Перенесено ПОСТІЙНО є більш доцільним.

Щоб зробити правильний вибір, ми повинні переглянути ваш конкретний випадок. Якщо ваша мета полягає в тому, щоб усі дзвінки на API v1 були відмовлені, не вживаючи жодних подальших дій, 410 GONE працює для цього. Якщо ви хочете певну послідовність, наприклад перенаправлення клієнта на нову версію вашого API, де їх дзвінок може бути успішним, 3XX працює, але яку ви обираєте? Я думаю, що якщо ви намагаєтесь вимкнути API v1, 301 ПЕРЕМОЖЕНО ПОТРІБНО допомагає вказати, що краще, ніж 303 ВИДІТЬ ІНШЕ, оскільки 301 пропонує всі майбутні запити надсилати до нового URL-адреси, тоді як 303 не вказує, чи є ця ситуація постійний.

Я рекомендую розробити API таким чином, щоб кожна версія залишалася зворотною сумісною, щоб 301 ПЕРЕМЕНЕНО ПОТРІБНО було б прозоро підтримувати ваш API живим та актуальним щоразу, коли ви додаєте нові кінцеві точки для нових версій API. Я думаю, що це все-таки намагаєшся зробити.

Коди статусу HTTP

Код статусу HTTP 302 спочатку був занадто широким і, таким чином, став неправильно реалізований / використаний, тому 303 та 307 були зроблені для розрізнення випадку подвійного використання 302. Деякі API використовують 303 для інших цілей.

301 ПЕРЕМЕНЕНО ПОСТІЙНО - Код стану 301 (переміщений постійно) вказує на те, що цільовому ресурсу присвоєно новий постійний URI і будь-які майбутні посилання на цей ресурс повинні використовувати один із вкладених URI.

302 FOUND - код статусу 302 (знайдений) вказує, що цільовий ресурс тимчасово знаходиться під іншим URI. Оскільки перенаправлення може бути змінено в деяких випадках, клієнт повинен продовжувати використовувати ефективний URI запиту для майбутніх запитів.

303 ВИДІТЬ ІНШЕ - Відповідь 303 на запит GET вказує на те, що сервер-джерело не має представлення цільового ресурсу, який може передаватися сервером через HTTP. Однак значення поля Місцеположення посилається на ресурс, який описує цільовий ресурс, таким чином, що запит на пошук на цьому іншому ресурсі може призвести до представлення, корисного для одержувачів, не маючи на увазі, що воно являє собою вихідний цільовий ресурс.

410 GONE - Код стану 410 (Пройшов) вказує на те, що доступ до цільового ресурсу більше не доступний на початковому сервері і що ця умова, ймовірно, буде постійною. Якщо сервер-джерело не знає або не має можливості визначати, чи є умова постійною чи ні, замість цього слід використовувати код стану 404 (Не знайдено).

Як існуючі API впораються з цим?

Можливо, ви можете скористатися сторінкою з API Youtube на Google :

Якщо запит API не вдається, YouTube поверне код відповіді HTTP 4xx або 5xx, який загалом ідентифікує збій, а також відповідь XML, яка надає більш конкретну інформацію про помилку (і), яка спричинила збій. Для кожної помилки відповідь XML включає елемент домену, елемент коду та, можливо, елемент розташування.

Подальше читання:


2
301 здається небезпечним. Це призведе до автоматичного переадресації на місце, яке може не мати однакового канонічного значення.
Брендон Ярбро

Оцініть вхід. Усі коди 3XX вказують на те, що клієнт повинен вжити додаткових дій (переспрямувати), надавши альтернативну URL-адресу в заголовку Location. Цікаво зазначити, що кожен код має дещо різну поведінку перенаправлення; a 303 буде перенаправляти POST на нове місце розташування як GET. Я обов'язково буду доповнювати цю відповідь додатковою інформацією.
perry

1

Перенаправлення чудово підходять для перенесених ресурсів. Замість постійного переспрямування 301 (який би вказував на перейменування без змін API), я б використовував переспрямування 303 "See Other".


0

Потрібно все-таки підтримувати спадщину без перенаправлень? Навіть якщо ви все ще підтримуєте його і глибоко в глибині його все ще реалізовується, 501, здається, є рука об руку з вашою ситуацією. Ті, хто знає, все ще могли ним користуватися, тоді як randoms побачили 501 для v1.

10.5.2 501 Не реалізовано

Сервер не підтримує функціонал, необхідний для виконання запиту. Це відповідна відповідь, коли сервер не розпізнає метод запиту і не здатний підтримувати його жодним ресурсом.

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html


0

Я б використав 503 із повідомленням, що сервіс недоступний, і вказати на використання нової версії. Це повідомлення можна повернути за 50% дзвінків і поступово збільшувати до 100%.

Для прозорої міграції я б використав 308 - Постійне переспрямування, оскільки цей метод не змінює дієслова (POST буде POST) на відміну від 301.

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