Що таке правильний код статусу відповіді на POST, коли батьківський ресурс не знайдений?


10

У мене є така кінцева точка:

a/{id}/b

і хочете створити запит на bнадсилання POSTдо нього. Якщо aз даними {id}не знайдено, чи слід відповідати 404 NOT_FOUNDчи, можливо, з 409 CONFLICT?

Це обробляти просто a/{id}, хитрість полягає в тому, що тут використовується субресурс.


Відповіді:


15

404 NOT FOUNDвидається відповідна відповідь, оскільки ресурс з цим ідентифікатором не існує. Це зрозуміло дуже зрозуміло, і ви очікуєте такої ж відповіді, якщо вас a/{id}зателефонують.

409 CONFLICTне здається мені кращим вибором, тому що у своєму прикладі ви повернете 409, коли батьківський ресурс не знайдений :).

Але пам’ятає, що найголовніше - це бути послідовним у вашому API


Я згоден. Якщо ви намагалися написати в папку, яка не існувала, це конфлікт чи помилка відсутньої папки? Мені це здається більш інтуїтивним.
Ніл

Під "папкою" ви маєте на увазі шлях, який не існує?
Дерік

Я маю на увазі папку, як у файловій системі.
Ніл

Чи можете ви детально розписати сценарій? Бо це залежить. Якщо папка очікувалася на сервері і (з будь-якої причини) їх немає, я думаю, що це помилка сервера (5xx), а не помилка клієнта (4xx). Якщо це значення папки передано клієнтом до ресурсу (як id), це 404. Але якщо папка була передана в тілі, це може бути що-небудь інше (412, 422 ... щось, що представляє "перевірка не вдалася: папка робить не існує "). Це гарне запитання та обговорення.
Дерік

Якщо ви запитаєте у сервера файл з path /nonexistent/help.html, а папка / noexisting не існує, на це є лише одна чітка відповідь. Файл 404 не знайдено! Може навіть існувати /home/help.html, і відповідь не відрізнятиметься. Це чітко додаток REST, але я не бачу причин, чому логіка змінилася б. Батько повинен існувати першим.
Ніл

4

Окрім відповіді @ Деріка.

URI - це ідентифікатори , тому ми маємо пам’ятати, що ( /a/{id}/bце ідентифікатор). URI НЕ має сенсу для WWW, і тому для клієнта HTTP.

404 - правильна відповідь . По суті, сервер відповідає

Я не знайшов жодного ресурсу з таким ідентифікатором. Ресурс не знайдено 1

Будь-який ресурс відсутній - це батько чи дитина, не має значення.

Ми, розробники, бачимо ієрархії та шляхи в URI, але клієнти HTTP цього не роблять. Іншими словами, HTTP призначений для інтерпретації лише клієнтів HTTP, але не людьми (розробниками, кінцевими користувачами тощо).

У разі сумнівів не запитуйте, який код має сенс для вас (людини). Запитайте, який код має сенс для HTTP-клієнта. Як ви хочете, щоб поводився HTTP-клієнт?

Чому? Оскільки деякий код статусу змушує цих клієнтів виконувати певні операції. Наприклад, 302 . Цей код зазвичай змушує веб-браузери перенаправляти на певне місце (URI), повідомлене в заголовках відповідей.

Це може бути не вашим випадком, але важливо знати. Зрештою, коди статусу HTTP адресовані клієнтам HTTP. Не до наших додатків. Не для осіб.


1: 409 рідко реалізується як помилка навігації. Зазвичай це передбачає виконання віддалених операцій (видалення, оновлення, нові тощо). Але URI повинен існувати. Інакше переважатиме 404

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