👋 Привет, друзья!
Сегодня мы будем обсуждать обработчики конечных точек!
Как показано на приведенной выше диаграмме, обработчик конечной точки является своего рода наблюдателем и верификатором всех входящих запросов к вашему серверу. Он выполняет важные проверки безопасности для каждого входящего запроса для любой конечной точки.
Если все идет хорошо, запрос обрабатывается сервером, в противном случае клиенту выдается ошибка 400/403 Forbidden по результатам проверки.
PS: все ошибки, начинающиеся с 4XX, связаны с клиентской частью.
Создайте машинописный текст обработчика конечных точек.
Так что это моя любимая часть. Мы увидим, как реализовать обработчики конечных точек.
Во-первых, давайте создадим конечную точку.
const getCatImages = async(req, res)=>{ if(req.method!=='GET') return res.status(400).end(); return res.status(200).json({url: "s3.images.blah/cat1.jpg"}) } export default getCatImages
Мы создали конечную точку, которая в значительной степени выполняет работу по получению изображений кошек.
Теперь у нас есть следующие ограничения.
1. Только любители кошек должны получать изображения кошек.
2. Только авторизованные пользователи могут получать изображения.
3. Любой пользователь, которому запрещено получать изображения кошек, должен получить запрещенный запрос.
Теперь мы могли бы создать конечную точку с учетом этих ограничений.
Но что, если у нас есть 100 конечных точек? И когда придет время обновить ограничения, нам, вероятно, потребуется обновить все эти 100 конечных точек.
Наступает роль обработчика конечной точки.
Итак, давайте создадим обработчик конечной точки, который возвращает «обещание, возвращающее функцию».
const EndpointHandler = async(endpoint, validations)=>{ return async(req,res) =>{ //Only Authenticated Users if(validations.onlyAuthenticated){ const response = await checkAuth(req) if(response.status !== 200) return res.status(403).json({message: 'Unauthenticated User"}) } //Cat Lovers Only Allowed if(validations.onlyCatLovers) { const response = await CheckCatLovers(req.cookies) if(response.status !== 200) return res.status(403).json({message:"You are not a cat lover"}) } // Banned Users Check if(validations.bannedUsersNotAllowed){ const response = await checkUserisBanned(req.cookies); if(response.status !== 200) return res.status(403).json({message:"You have been banned. Contact Group Admin"}); } } } export default EndpointHandler
Итак, теперь наша конечная точка проверяет необходимые проверки.
Теперь нам нужно обернуть этот обработчик конечной точки в нашу конечную точку.
Вернемся к первому фрагменту кода.
import EndpointHandler from './EndpointHandler'; const getCatImages = async(req, res)=>{ if(req.method!=='GET') return res.status(400).end(); return res.status(200).json({url: "s3.images.blah/cat1.jpg"}) } export default EndpointHandler(getCatImages, { onlyAuthenticated:true, onlyCatLovers:true, bannedUsersNotAllowed:true });
Вот как мы успешно интегрировали обработчик конечной точки с конечной точкой. Этот подход помогает нам писать более качественный и безопасный код с одним источником файла проверки.
Преимущества
Вы можете больше сосредоточиться на написании бизнес-логики и обернуть обработчик внутри, не беспокоясь о защите конечной точки.
У вас есть поддерживаемая и легко отлаживаемая кодовая база.
Вы знаете лучшие практики, которые можно применять где угодно
Минусы
Ничего подобного, но он больше подходит для служб, имеющих согласованные конечные точки. Для систем с разнообразными операциями могут потребоваться разные обработчики конечных точек.
Это все люди.
Если вы что-то узнали, поделитесь этим в Твиттере: https://twitter.com/imabptweets
Хотел бы сделать RT.
Больше контента на plainenglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку здесь.