HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Представим, что мы разрабатываем социальную сеть, и нам нужно реализовать функцию публикации поста. Если не проверять данные, которые вводит пользователь, то мы можем получить пост с пустым или слишком длинным текстом. Обычно такие ошибки приводят к некорректному поведению в приложениях. Это не хорошо, потому что пользователь не сможет понять, что произошло, и нам придется разбираться, почему пост не опубликовался.</p>
1 <p>Представим, что мы разрабатываем социальную сеть, и нам нужно реализовать функцию публикации поста. Если не проверять данные, которые вводит пользователь, то мы можем получить пост с пустым или слишком длинным текстом. Обычно такие ошибки приводят к некорректному поведению в приложениях. Это не хорошо, потому что пользователь не сможет понять, что произошло, и нам придется разбираться, почему пост не опубликовался.</p>
2 <p>В этом уроке мы разберем, как проверять HTTP-запросы в Go. Это важно, потому что проверки позволяют избежать ошибок и обеспечить безопасность нашего приложения.</p>
2 <p>В этом уроке мы разберем, как проверять HTTP-запросы в Go. Это важно, потому что проверки позволяют избежать ошибок и обеспечить безопасность нашего приложения.</p>
3 <p>Процесс проверки запросов на корректность перед последующей обработкой называется<strong>валидацией</strong>:</p>
3 <p>Процесс проверки запросов на корректность перед последующей обработкой называется<strong>валидацией</strong>:</p>
4 <p>У разработчиков есть несколько вариантов реализации валидации в Go. В некоторых проектах придерживаются идеологии простоты чтения кода и реализуют валидацию вручную.</p>
4 <p>У разработчиков есть несколько вариантов реализации валидации в Go. В некоторых проектах придерживаются идеологии простоты чтения кода и реализуют валидацию вручную.</p>
5 <p>Например, валидация запроса на сохранение поста может выглядеть следующим образом:</p>
5 <p>Например, валидация запроса на сохранение поста может выглядеть следующим образом:</p>
6 <p>Запускаем веб-приложение и отправляем запрос на создание поста с некорректными данными:</p>
6 <p>Запускаем веб-приложение и отправляем запрос на создание поста с некорректными данными:</p>
7 <p>В данном запросе мы указали некорректный идентификатор пользователя и пустой текст поста. В ответ получаем сообщение об ошибке:</p>
7 <p>В данном запросе мы указали некорректный идентификатор пользователя и пустой текст поста. В ответ получаем сообщение об ошибке:</p>
8 <p>Попробуем отправить корректные значения:</p>
8 <p>Попробуем отправить корректные значения:</p>
9 <p>В ответ приходит статус<em>200 OK</em>, что означает успешное прохождение проверок.</p>
9 <p>В ответ приходит статус<em>200 OK</em>, что означает успешное прохождение проверок.</p>
10 <p>Таким образом, мы настроили проверку запросов, которые приходят в наше веб-приложение. Если запрос на создание поста содержит некорректные данные, то мы возвращаем ошибку. В случае успешной валидации запроса мы возвращаем ответ со статусом<em>200 OK</em>.</p>
10 <p>Таким образом, мы настроили проверку запросов, которые приходят в наше веб-приложение. Если запрос на создание поста содержит некорректные данные, то мы возвращаем ошибку. В случае успешной валидации запроса мы возвращаем ответ со статусом<em>200 OK</em>.</p>
11 <p>Со стороны кода в данной реализации все проверки описаны явно и легко читаются. Когда новый разработчик присоединится к проекту, он быстро поймет логику приложения, и как проверяются запросы.</p>
11 <p>Со стороны кода в данной реализации все проверки описаны явно и легко читаются. Когда новый разработчик присоединится к проекту, он быстро поймет логику приложения, и как проверяются запросы.</p>
12 <p>У этого подхода также есть один значимый недочет: этот подход плохо масштабируется. Если у нас будет много различных методов с множеством полей, которые нужно проверить, то код станет громоздким. В итоге со временем может возникнуть много повторяющегося кода.</p>
12 <p>У этого подхода также есть один значимый недочет: этот подход плохо масштабируется. Если у нас будет много различных методов с множеством полей, которые нужно проверить, то код станет громоздким. В итоге со временем может возникнуть много повторяющегося кода.</p>
13 <p>Второй недочет - мы выводим по одной ошибке в одном ответе. Например, структура запроса состоит из пяти полей. Все поля заполнены неверно. В текущей реализации пользователю придется сделать пять запросов, при этом исправлять по одному полю после каждого ответа. Это неудобно, поэтому мы бы хотели возвращать все ошибки в одном ответе.</p>
13 <p>Второй недочет - мы выводим по одной ошибке в одном ответе. Например, структура запроса состоит из пяти полей. Все поля заполнены неверно. В текущей реализации пользователю придется сделать пять запросов, при этом исправлять по одному полю после каждого ответа. Это неудобно, поэтому мы бы хотели возвращать все ошибки в одном ответе.</p>
14 <p>Чтобы решить эти недочеты, следует использовать готовую библиотеку для валидации запросов. Мы рассмотрим самую часто используемую библиотеку в Go -<a>go-playground/validator</a>. Далее будем ее называть Validator.</p>
14 <p>Чтобы решить эти недочеты, следует использовать готовую библиотеку для валидации запросов. Мы рассмотрим самую часто используемую библиотеку в Go -<a>go-playground/validator</a>. Далее будем ее называть Validator.</p>
15 <h2>Валидация запросов с помощью Validator</h2>
15 <h2>Валидация запросов с помощью Validator</h2>
16 <p>Библиотека Validator позволяет реализовать валидацию запросов с помощью аннотаций полей структур. Для каждого поля структуры мы описываем список правил проверок, которые необходимо осуществить. Например, валидация запроса на публикацию поста может выглядеть следующим образом:</p>
16 <p>Библиотека Validator позволяет реализовать валидацию запросов с помощью аннотаций полей структур. Для каждого поля структуры мы описываем список правил проверок, которые необходимо осуществить. Например, валидация запроса на публикацию поста может выглядеть следующим образом:</p>
17 <p>Запускаем веб-приложение и отправляем запрос на создание поста с некорректными данными:</p>
17 <p>Запускаем веб-приложение и отправляем запрос на создание поста с некорректными данными:</p>
18 <p>В данном запросе мы указали некорректный идентификатор пользователя и пустой текст поста. В ответ получаем сообщение об ошибке:</p>
18 <p>В данном запросе мы указали некорректный идентификатор пользователя и пустой текст поста. В ответ получаем сообщение об ошибке:</p>
19 <p>Попробуем отправить корректные значения:</p>
19 <p>Попробуем отправить корректные значения:</p>
20 <p>В ответ приходит статус<em>200 OK</em>, что означает успешное прохождение проверок.</p>
20 <p>В ответ приходит статус<em>200 OK</em>, что означает успешное прохождение проверок.</p>
21 <p>Так мы реализовали валидацию запросов с помощью библиотеки Validator. Когда мы передаем некорректные данные, то в ответ получаем сообщение об ошибке. Оно позволяет понять, какие данные необходимо исправить. Если все данные заполнены правильно, то мы получаем статус<em>200 OK</em>.</p>
21 <p>Так мы реализовали валидацию запросов с помощью библиотеки Validator. Когда мы передаем некорректные данные, то в ответ получаем сообщение об ошибке. Оно позволяет понять, какие данные необходимо исправить. Если все данные заполнены правильно, то мы получаем статус<em>200 OK</em>.</p>
22 <p>Мы видим, что в данном случае код стал намного короче и легче читается. Мы можем описывать новые правила валидации и не добавлять новых функций и логики.</p>
22 <p>Мы видим, что в данном случае код стал намного короче и легче читается. Мы можем описывать новые правила валидации и не добавлять новых функций и логики.</p>
23 <p>Однозначное преимущество по сравнению с ручной валидацией - библиотека уже содержит в себе множество готовых правил проверок, которые можно использовать в своих проектах. Например, мы можем проверить, что поле является корректной электронной почтой:</p>
23 <p>Однозначное преимущество по сравнению с ручной валидацией - библиотека уже содержит в себе множество готовых правил проверок, которые можно использовать в своих проектах. Например, мы можем проверить, что поле является корректной электронной почтой:</p>
24 <p>Полный список правил проверок можно смотреть в<a>документации</a>.</p>
24 <p>Полный список правил проверок можно смотреть в<a>документации</a>.</p>
25 <h2>Пользовательские валидаторы</h2>
25 <h2>Пользовательские валидаторы</h2>
26 <p>Готовые правила обычно покрывают большинство нужд в валидации запросов. Но иногда нужно добавить свои правила с пользовательской логикой. Для этого можно использовать функцию validate.RegisterValidation().</p>
26 <p>Готовые правила обычно покрывают большинство нужд в валидации запросов. Но иногда нужно добавить свои правила с пользовательской логикой. Для этого можно использовать функцию validate.RegisterValidation().</p>
27 <p>Например, мы хотим проверить, что в публикуемом посте отсутствуют слова-фильтры. Для этого мы напишем следующий код:</p>
27 <p>Например, мы хотим проверить, что в публикуемом посте отсутствуют слова-фильтры. Для этого мы напишем следующий код:</p>
28 <p>Запускаем веб-приложение и отправляем запрос на создание поста с текстом, который содержит слово-фильтр:</p>
28 <p>Запускаем веб-приложение и отправляем запрос на создание поста с текстом, который содержит слово-фильтр:</p>
29 <p>В ответ получаем валидационную ошибку:</p>
29 <p>В ответ получаем валидационную ошибку:</p>
30 <p>Если же отправить запрос с текстом без запрещенных слов, то получим успешный ответ:</p>
30 <p>Если же отправить запрос с текстом без запрещенных слов, то получим успешный ответ:</p>
31 <p>В итоге мы описали пользовательское правило валидации по тегу<em>allowable_text</em>. Оно проверяет, что текстовое поле не содержит запрещенных слов.</p>
31 <p>В итоге мы описали пользовательское правило валидации по тегу<em>allowable_text</em>. Оно проверяет, что текстовое поле не содержит запрещенных слов.</p>
32 <p>Когда приходит запрос с запрещенным словом, валидация не проходит, а клиенту возвращается ошибка. Если в запросе передать корректный текст, то валидация пройдет успешно, и клиент получит ответ со статусом<em>200 OK</em>.</p>
32 <p>Когда приходит запрос с запрещенным словом, валидация не проходит, а клиенту возвращается ошибка. Если в запросе передать корректный текст, то валидация пройдет успешно, и клиент получит ответ со статусом<em>200 OK</em>.</p>
33 <h2>Выводы</h2>
33 <h2>Выводы</h2>
34 <ul><li>В веб-приложениях следует проверять все запросы на корректность, чтобы избежать ошибок и уязвимостей</li>
34 <ul><li>В веб-приложениях следует проверять все запросы на корректность, чтобы избежать ошибок и уязвимостей</li>
35 <li>В Go можно описывать правила валидации явно или с помощью готовых библиотек</li>
35 <li>В Go можно описывать правила валидации явно или с помощью готовых библиотек</li>
36 <li>Библиотека Validator позволяет описывать правила валидации с помощью аннотаций полей структур. Это позволяет сократить код и упростить его чтение и поддержку</li>
36 <li>Библиотека Validator позволяет описывать правила валидации с помощью аннотаций полей структур. Это позволяет сократить код и упростить его чтение и поддержку</li>
37 <li>Функция validate.RegisterValidation() позволяет описывать пользовательские правила валидации</li>
37 <li>Функция validate.RegisterValidation() позволяет описывать пользовательские правила валидации</li>
38 </ul>
38 </ul>