Прозрачная модификация HTTP-запросов

GolangGolangBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом проекте вы научитесь реализовывать прозрачную модификацию 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.

  1. Откройте файл md5_transport.go в редакторе.
  2. Добавьте необходимый контент в import.
import (
	"bytes"
	"crypto/md5"
	"encoding/hex"
	"io"
	"net/http"
)
  1. В функции 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.

  1. После добавления кода сохраните файл md5_transport.go.

Проверьте реализацию

Для проверки реализации следуйте шагам:

  1. Откройте терминал в редакторе.

  2. Перейдите в каталог проекта:

    $ cd /home/labex/project
  3. Запустите тесты:

    $ /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, чтобы улучшить свои навыки.