HTTP status code external dependency

25 views
Skip to first unread message

Stefan Angelov

unread,
May 31, 2021, 11:36:44 AM5/31/21
to Bulgarian Java Users Group
Здравейте,
Имам следния случай имам един сървис които е REST базиран, той от своя страна си говори с други сървиси. Тук е клучовото, тези сървиси винаги дават 200 като статус код, но в тях може има error които се състой от errorCode и error message. Въпроса е какъв би бил най правилния статус код ако сървиса които винаги дава 200 ми даде errorCode (errorCode са бизнес кодове, и нямам право да променям този сървис).

Поздрави,
Стефан 

Ivan St. Ivanov

unread,
May 31, 2021, 11:53:54 AM5/31/21
to bg-...@googlegroups.com
Здрасти Стефчо,

Такива сървиси са ми любимите - с малки изключения са правени от хора, които още живеят в SOAP света :D

Ами много зависи от типа на грешката. Може ли по error code-а да се ориентираш еднозначно какъв е проблемът?

Обикновено, не 200 грешки може да са:
  • 400: ако форматът на input-а, който се подава на твоя, а от там на downstream service-а, не е наред
  • 404: ако се търси (било то за четене или update) ресурс, който не съществува. Тук е малко спорно, защото твоя клиент не може лесно да се ориентира само по response code-а дали вика грешния endpoint или просто вика верен endpoint но с грешни данни. Объркването става още по-тежко, когато имаш API gateway и reverse proxy пред твоята Java
  • 503: когато downstream service-ът ти не е достъпен по някаква причина
  • 401: ако достъпът до съответния ресурс изисква автентикация, а твоя клиент не я е предоставил
  • 403: ако нямаш права да достъпваш съответния ресурс 
Но ако не можеш да се ориентираш по error code-а или трябва да парсваш error message, по-добре следвай тяхната схема :(

Поздрави,
Иван

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/d0d6a3f9-15f7-489a-aeaf-345d525a22f2n%40googlegroups.com.

Stefan Angelov

unread,
May 31, 2021, 1:25:32 PM5/31/21
to Bulgarian Java Users Group
Здравейте отново, 
Това което ми предлагат е 500 винаги като сървиса даде грешка, с errorCode вътре в него. Иначе и аз си мислих спрамо errorCode да си направя правилния HTTP code, но това ще изисква много дискусия с други екипи. Но благодаря за идеите и подробного описание :) 

Поздрави,
Стефан

Mihail Georgiev

unread,
Jun 5, 2021, 4:08:28 AM6/5/21
to Bulgarian Java Users Group
Здравей, 
Наистина вече сме свикнали информацията за типа на грешката да се съдържа в HTTP статус кода, но спокойно може да се направи система, която слага тази грешка в поле от body-то на резултата, хедърите, кукитата или на друго място, а не в статус кода. За комуникацията между два сървиса това в коя точно част от response ще се съдържа тази информация, е все едно. Но повечето готови java http клиенти ще трябва да се надграждат, вместо да се използват "чисти". Например, нека вземем сървис А, който ще прави заявка към такъв друг сървис B, като сървис B винаги връща http status code 200, а ако има грешка, тя е в json body-то на response. Може ли сървис A да разбере, когато сървис B му върне някаква грешка и да прецени каква точно е тя? Може. Дотук супер. Но, например, повечето http java клиенти при върнат http response code 404 ще хвърлят някакъв вид NotFoundException. Може ли да се направи това в ситуацията с нашите два сървиса А и B? Може, но трябва да се напише и изкомуникира между екипите, поддържащи A и B, докато иначе всичко би било ясно по подразбиране. Нещо от сорта на (псевдокод) class MyHttpClient extends HttpClient{ .... if (response.getBody().get('errorCode') == 404) throw new NotFoundException. В крайна сметка резултатът е абсолютно същият, но ще трябва малко работа отгоре.
След като си поставен в ситуация, в която трябва да се адаптираш, може би трябва да започнеш с нещо такова. Много е вероятно и да измислиш по-добър вариант с по-малко работа. Успех!

Поздрави, М. Георгиев

Ivan St. Ivanov

unread,
Jun 6, 2021, 2:59:51 PM6/6/21
to bg-...@googlegroups.com
Съгласен съм, че може да се вкара в тялото на response-а грешката.

И съм съгласен за двусмислието на 404 (даже го написах в първия си mail).

Като изключим теоретичните постановки кога се връща 4xx и кога 2xx, предимството да се ползва 4xx код за грешка е, че повечето клиенти (основно JS) си имат различни handler-и за 2xx и 4xx/5xx отговори.  

За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/06c73cf6-81a9-45fc-9fd4-44daf9b3a2dcn%40googlegroups.com.

Stefan Angelov

unread,
Jun 7, 2021, 2:57:35 AM6/7/21
to Bulgarian Java Users Group
Здравейте, 
Това което бяхме направили като дизайн в предишната компания. Беше комбинация от HTTP status codes + бизнес кодове за грешки които са в респосна. Така решавахме проблема с това дали 404 означава че го няма ресурса или нещо по различно с бизнес насоченост. За жалост тогава имахме контрол върху цялата система, а сега нямаме този контрол. Благодаря Ви за дискусията, беше ми много полезна.

Поздрави,
Стефан
Reply all
Reply to author
Forward
0 new messages