GET API: Без съдържание: 404 срещу 204 срещу 200

Какъв е HTTP отговорът, който вашият REST API трябва да върне, когато исканият ресурс не съществува. Например, помислете за следния API, за да получите служител

ВЗЕМЕТЕ http://yourservice.com/api/v1/employees/1
Заглавие на отговора: 200
Тяло: {
           "Име": "Сантош",
           "Отдел": "Инженеринг"
      }

Когато исканият служител не съществува

ВЗЕМЕТЕ http://yourservice.com/api/v1/employees/2
Заглавие на отговора: ???
Тяло: ???

Има три възможности за избор; 404, 204 и 200. И трите изглеждат подходящи за случая. Нека ги разгледаме подробно с цел да изберем най-добрия. Нека започнем с

404 Страницата не е намерена

Съгласно дефиницията на кода на състоянието на HTTP ...

„Сървърът не е намерил нищо, което да съответства на URI-заявката. Не се посочва дали състоянието е временно или постоянно. Кодът на състоянието 410 (Gone) ТРЯБВА да се използва, ако сървърът знае чрез вътрешно конфигурируем механизъм, че стар ресурс е постоянно недостъпен и няма адрес за пренасочване. Този код на състоянието обикновено се използва, когато сървърът не желае да разкрие точно защо заявката е отказана или когато не е приложим друг отговор. “

Първото твърдение има идеален смисъл за случая. Въпреки това, когато четете напред, ясно е, че 404 не е правилният избор поради следните причини

  • Кодът се използва, когато ресурсът е постоянно недостъпен, което тук не е така.
  • Сървърът не желае да крие точната причина.
  • Има трета причина да не се използва 404; серията 4xx е предназначена да сигнализира за клиентски грешки. Но ресурсът за почивка, който не е наличен, не е грешка. Това е временно състояние.

И двамата останали кандидати принадлежат към категория 2xx.

„Този ​​клас код на състоянието показва, че заявката на клиента е успешно получена, разбрана и приета.“

Да! това има смисъл за дадения случай. Така че един от тези кодове за грешки трябва да бъде по-добър избор в сравнение с 404. Нека започнем с по-малко познатите ...

204 Без съдържание

Съгласно дефиницията на кода на състоянието на HTTP ...

Сървърът е изпълнил заявката, но не е необходимо да връща субект-орган и може да иска да върне актуализирана мета информация. Отговорът МОЖЕ да включва нова или актуализирана мета информация под формата на заглавия на субекти, които, ако са налице, ТРЯБВА да бъдат свързани с искания вариант.
Ако клиентът е потребителски агент, той НЕ трябва да променя изгледа на документа си от този, който е причинил изпращането на заявката. Този отговор е предназначен преди всичко да позволи въвеждането на действия, без да предизвиква промяна в активния изглед на документа на потребителския агент, въпреки че всяка нова или актуализирана мета информация трябва да се прилага към документа, който в момента е в активния изглед на потребителския агент.
Отговорът 204 НЕ ТРЯБВА да включва тяло на съобщението и по този начин винаги се прекратява от първия празен ред след полетата на заглавката.

204 изглежда като подходящия кандидат, тъй като самата му кратка форма е „Без съдържание“. Въпреки това, когато изучавате определението, от четвъртото изявление (удебелен текст) е видно, че 204 е идеален, когато дадено действие се извършва на сървър. т.е. POST, PUT или DELETE; Но това не е така, когато клиентът се позовава на GET заявка.

Оставаме с най-често използваните 200 ОК

200 ОК {с празно тяло}

Съгласно дефиницията на кода на Http Status

Заявката е успешна. Информацията, върната с отговора, зависи от метода, използван в заявката, например:
ВЗЕМЕТЕ в отговора образувание, отговарящо на искания ресурс; ....

Когато сървърът върне 200 с празно тяло, това може да се интерпретира като „заявката се обработва успешно, но ресурсът е празен“. Въпреки че няма нарушение на HTTP стандартите, това изглежда малко шарено. Въпреки това, като се имат предвид другите избори, това е много по-добър вариант поради следните причини.

  • То е в съответствие с общото поведение на сървъра.
  • Не е необходимо клиентският код да обработва друг HTTP код за отговор.

заключение

Когато REST GET API заявка не съдържа съдържание, 200 с празно тяло е най-добрият избор на отговор.

ВЗЕМЕТЕ http://yourservice.com/api/v1/employees/2
Заглавие на отговора: 200
Тяло: {}