Введение
В этом проекте вы научитесь реализовывать прозрачную модификацию HTTP-запросов с использованием интерфейса http.RoundTripper в Go. Вы создадите пользовательский HTTP-транспорт, который вычисляет MD5-хэш тела запроса и добавляет его в заголовок запроса в качестве поля "X-Md5".
👀 Предварительный просмотр
$ /usr/local/go/bin/go test
PASS
ok md5transport 0.004s
🎯 Задачи
В этом проекте вы научитесь:
- Как инкапсулировать интерфейс
http.RoundTripperдля выполнения пользовательских операций с HTTP-запросами и ответами. - Как вычислять MD5-хэш тела запроса и добавлять его в заголовок запроса.
- Как сбросить тело запроса после вычисления MD5-хэша, чтобы сохранить исходное состояние запроса.
🏆 Достижения
После завершения этого проекта вы сможете:
- Разобраться в концепции прозрачной модификации HTTP-запросов в Go.
- Реализовать пользовательские HTTP-транспортные слои, которые могут выполнять различные операции с запросами и ответами.
- Применить полученные знания для расширения собственных приложений дополнительными функциями, такими как аутентификация, логирование или манипуляция с запросами/ответами.
Реализуйте вычисление MD5 и модификацию заголовка
В этом шаге вы научитесь реализовывать простую функцию проверки данных, которая вычисляет MD5 тела запроса, преобразует его в шестнадцатеричный формат и добавляет в заголовок запроса с именем X-Md5.
- Откройте файл
md5_transport.goв редакторе. - Добавьте необходимый контент в
import.
import (
"bytes"
"crypto/md5"
"encoding/hex"
"io"
"net/http"
)
- В функции
RoundTripструктурыTransportдобавьте следующий код для вычисления MD5 тела запроса и установки его в заголовок запроса:
// Завершите код
// если тело запроса не nil, вычислите md5 и установите в заголовок
if req.Body!= nil {
body, err := io.ReadAll(req.Body)
if err!= nil {
// Если произошла ошибка при чтении тела, верните исходный запрос.
// не прерывайте запрос
return t.RoundTripper.RoundTrip(req)
}
// Вычислите md5
md5Hash := md5.Sum(body)
md5HashStr := hex.EncodeToString(md5Hash[:])
// Установите md5 в заголовок
req.Header.Set("X-Md5", md5HashStr)
// Сбросьте тело запроса
req.Body = io.NopCloser(bytes.NewReader(body))
}
Этот код сначала проверяет, не является ли тело запроса nil. Если нет, он читает целое тело с использованием io.ReadAll, вычисляет MD5-хэш с использованием пакета md5 и преобразует хэш в шестнадцатеричную строку. Затем он устанавливает заголовок "X-Md5" с вычисленным значением MD5. Наконец, он сбрасывает тело запроса в исходное состояние с использованием bytes.NewReader.
- После добавления кода сохраните файл
md5_transport.go.
Тестируйте реализацию
Для проверки реализации следуйте шагам:
Откройте терминал в редакторе.
Перейдите в каталог проекта:
cd /home/labex/projectЗапустите тесты:
/usr/local/go/bin/go test
Если код реализован правильно, вы должны увидеть следующий вывод:
PASS
ok md5transport 0.004s
Это означает, что тесты пройдены, и ваша реализация вычисления MD5 и модификации заголовка работает как ожидается.
Разберитесь в прозрачной модификации HTTP-запросов
В Go мы часто отправляем сетевые запросы с использованием http.Client, который внутри создает http.Request и затем использует http.RoundTripper.RoundTrip для отправки фактического запроса. Действительные операции передачи данных выполняются внутри RoundTrip.
С помощью инкапсуляции интерфейса http.RoundTripper мы можем выполнять различные операции с запросами и ответами, такие как аутентификация, статистика, аудит логгирования и модификация запросов, при этом все это прозрачно для пользователя.
В этом испытании мы реализовали простую функцию проверки данных, которая вычисляет MD5 тела запроса и добавляет его в заголовок запроса. Это всего лишь один пример того, как можно использовать интерфейс http.RoundTripper для прозрачной модификации HTTP-запросов.
При проектировании своей модульной библиотеки или использовании компонентов других разработчиков вы можете подумать, как можно применить этот метод для добавления дополнительной функциональности или модификации поведения вашего приложения в прозрачном режиме.
Резюме
Поздравляем! Вы завершили этот проект. Вы можете практиковаться в более многих лабораторных работах в LabEx, чтобы улучшить свои навыки.



