Size: a a a

JavaScript.Ninja

2020 August 09

R

Remite in JavaScript.Ninja
El Nasurov
Вcем привет, такой вопрос -  в проектах, должен ли фронт всецело доверять ответам, которые задокументированы в описании api метода ? Или же он обязан у себя перед обработкой ответа от бэка проверить, что ему пришел ожидаемый формат данных и только при успешной проверке формата ответа выполнять какую-то логику с ним, а, если формат хоть немного отличается от задокументированного, то считать его "ошибочным" и, например, отображать заглушку какую-нибудь (аля произошла ошибка при получении данных") ?


Например.
Есть метод get-user-info. В api-документации описано, что при  успешном ответе, возвращается объект с  фамилией, именем и отчеством. Необходимо ли делать что-то типа такой проверки (в данном кейсе можно проверять, что ответом является объект, содержащий три строчки: фамилия, имя и отчество):
try {
 const  { data  } = await Axios.get(GET_FIO);
 if (isValidResponse(data)) {
   //логика обработки в случае ожидаемого формата респонса
 } else throw new Error();
} catch (e) {
 //логика обработки ошибочного запроса (статус не равен 2xx) и если не прошел isValidResponse
}
АПИ это внешний источник данных и доверять ему нет никаких оснований, точно так же как пользователю
Все что приходит из ВНЕ - потенциально может быть плохим и должно быть перепроверено

Вопрос про как обрабатывать индивидуально, если данные которых не хватает это нечто "Обязательное" то конечно ошибка и всё, если есть возможность что-то юзеру показать то можно показать а уже себе где-то залогировать что бек присылает что-то не так
источник

R

Remite in JavaScript.Ninja
например если пользователь может насладится только именем и фамилией и отсутсвия отчества не несет ничего кретического
то покажите пользователю имя и фамилию, а про отчество напишите в логи, потом перебирая логи найдете что что-то пошло не так
источник

EN

El Nasurov in JavaScript.Ninja
Отлично. А как этот процесс "проверки данных, возвращаемых в ответ на api метод" корректно называется ?

Просто мне хотелось бы загуглить, так как, как мне кажется, явно должны быть специальные библиотеки для реактка/вью, в которых это можно удобно и декларативно описать, нежели в каждом запросе запускать такую произвольную функцию isValidResponse..
источник

IK

Illya Klymov in JavaScript.Ninja
El Nasurov
Отлично. А как этот процесс "проверки данных, возвращаемых в ответ на api метод" корректно называется ?

Просто мне хотелось бы загуглить, так как, как мне кажется, явно должны быть специальные библиотеки для реактка/вью, в которых это можно удобно и декларативно описать, нежели в каждом запросе запускать такую произвольную функцию isValidResponse..
Контракты
источник

IK

Illya Klymov in JavaScript.Ninja
источник

IK

Illya Klymov in JavaScript.Ninja
Как пример
источник

IK

Illya Klymov in JavaScript.Ninja
В более общем виде это просто "ввлидация" - для которой куча популярных библиотек
источник

V

Valentin in JavaScript.Ninja
El Nasurov
Вcем привет, такой вопрос -  в проектах, должен ли фронт всецело доверять ответам, которые задокументированы в описании api метода ? Или же он обязан у себя перед обработкой ответа от бэка проверить, что ему пришел ожидаемый формат данных и только при успешной проверке формата ответа выполнять какую-то логику с ним, а, если формат хоть немного отличается от задокументированного, то считать его "ошибочным" и, например, отображать заглушку какую-нибудь (аля произошла ошибка при получении данных") ?


Например.
Есть метод get-user-info. В api-документации описано, что при  успешном ответе, возвращается объект с  фамилией, именем и отчеством. Необходимо ли делать что-то типа такой проверки (в данном кейсе можно проверять, что ответом является объект, содержащий три строчки: фамилия, имя и отчество):
try {
 const  { data  } = await Axios.get(GET_FIO);
 if (isValidResponse(data)) {
   //логика обработки в случае ожидаемого формата респонса
 } else throw new Error();
} catch (e) {
 //логика обработки ошибочного запроса (статус не равен 2xx) и если не прошел isValidResponse
}
Должен доверять. Все должны доверять. Это же публичный контракт.
источник

V

Valentin in JavaScript.Ninja
Valentin
Должен доверять. Все должны доверять. Это же публичный контракт.
А авторы должны соблюдать его корректность.
источник

V

Valentin in JavaScript.Ninja
А зачем это? Какой то сложный сахар.
источник

IK

Illya Klymov in JavaScript.Ninja
Valentin
А зачем это? Какой то сложный сахар.
Для описания контрактов которые работают и в runtime и в compile-time
источник

V

Valentin in JavaScript.Ninja
Illya Klymov
Для описания контрактов которые работают и в runtime и в compile-time
почему сразу не предлагать сваггер или типа того, для документации апи?
источник

IK

Illya Klymov in JavaScript.Ninja
Valentin
почему сразу не предлагать сваггер или типа того, для документации апи?
Это не документация апи. Это способ описать ожидаемый системой контракт на значение.

И учитывая что js язык со слабой типизацией, я за строгую валидацию контрактов на границах слоев до тех пор пока это не бьёт по производительности
источник

IK

Illya Klymov in JavaScript.Ninja
Чем раньше мы узнаем что что-то пошло не так, тем лучше
источник

V

Valentin in JavaScript.Ninja
спасибо
источник

IK

Illya Klymov in JavaScript.Ninja
Из недавнего - на одном из проектов где применяются канареечные развертывания была допущена ошибка и получалось что код фронтенда отдавался с основного сервера, а Аякс запрос (из-за того что ку-ку не передали в сервис воркере) мог уйти на канареечный сервер где был уже новый формат данных
источник

EN

El Nasurov in JavaScript.Ninja
Illya Klymov
Контракты
А какие решения для такого определения ожидаемого контракта при axios запросах можете порекомендовать для vue-проекта из личного опыта ?

Не очень понятно, почему такой механизм не предполагают сами библиотеки, с помощью которых делаются api запросы. Ведь было бы удобно, например, в сам axios в вызов запроса прокидывать объект с ожидаемым форматом данных и в случае не соответствия, axios просто возвращал бы rejected промис с соответствующим месседжем в объекте ошибки (как он делает запросами со статусом, отличным от 2xx)..
источник

V

Valentin in JavaScript.Ninja
El Nasurov
А какие решения для такого определения ожидаемого контракта при axios запросах можете порекомендовать для vue-проекта из личного опыта ?

Не очень понятно, почему такой механизм не предполагают сами библиотеки, с помощью которых делаются api запросы. Ведь было бы удобно, например, в сам axios в вызов запроса прокидывать объект с ожидаемым форматом данных и в случае не соответствия, axios просто возвращал бы rejected промис с соответствующим месседжем в объекте ошибки (как он делает запросами со статусом, отличным от 2xx)..
Это другой «слой», уверен есть библиотеки реализующие функционал в той или иной мере.
Запрос ты можешь сделать через фетч реализуемый браузерным апи (жс). Вообще вуе так же написан на жс
источник

IK

Illya Klymov in JavaScript.Ninja
El Nasurov
А какие решения для такого определения ожидаемого контракта при axios запросах можете порекомендовать для vue-проекта из личного опыта ?

Не очень понятно, почему такой механизм не предполагают сами библиотеки, с помощью которых делаются api запросы. Ведь было бы удобно, например, в сам axios в вызов запроса прокидывать объект с ожидаемым форматом данных и в случае не соответствия, axios просто возвращал бы rejected промис с соответствующим месседжем в объекте ошибки (как он делает запросами со статусом, отличным от 2xx)..
Не надо скрещивать ежа с ужом. Аксиос решает конкретную маленькую задачу
источник

IK

Illya Klymov in JavaScript.Ninja
А валидировать - тысячи библиотек
источник