Introdução
Neste projeto, você aprenderá como implementar uma modificação transparente de requisições HTTP usando a interface http.RoundTripper do Go. Você criará um transporte HTTP customizado que calcula o hash MD5 do corpo da requisição e o adiciona ao cabeçalho da requisição como o campo "X-Md5".
👀 Pré-visualização
$ /usr/local/go/bin/go test
PASS
ok md5transport 0.004s
🎯 Tarefas
Neste projeto, você aprenderá:
- Como encapsular a interface
http.RoundTripperpara realizar operações customizadas em requisições e respostas HTTP. - Como calcular o hash MD5 do corpo da requisição e adicioná-lo ao cabeçalho da requisição.
- Como resetar o corpo da requisição após calcular o hash MD5 para manter o estado original da requisição.
🏆 Conquistas
Após completar este projeto, você será capaz de:
- Entender o conceito de modificação transparente de requisições HTTP em Go.
- Implementar camadas de transporte HTTP customizadas que podem realizar várias operações em requisições e respostas.
- Aplicar o conhecimento para aprimorar suas próprias aplicações com funcionalidades adicionais, como autenticação, logging ou manipulação de requisições/respostas.
Implementar o Cálculo MD5 e a Modificação do Cabeçalho
Nesta etapa, você aprenderá como implementar uma função simples de verificação de dados que calcula o MD5 do corpo da requisição, o converte para hexadecimal e o adiciona ao cabeçalho da requisição com o nome X-Md5.
- Abra o arquivo
md5_transport.gono editor. - Adicione o conteúdo necessário ao
import.
import (
"bytes"
"crypto/md5"
"encoding/hex"
"io"
"net/http"
)
- Na função
RoundTripda structTransport, adicione o seguinte código para calcular o MD5 do corpo da requisição e defini-lo no cabeçalho da requisição:
// Complete the code
// if reqeust body is not nil, calculate md5 and set to header
if req.Body != nil {
body, err := io.ReadAll(req.Body)
if err != nil {
// If read body error, return the original request.
// dont't interrupt the request
return t.RoundTripper.RoundTrip(req)
}
// Calculate md5
md5Hash := md5.Sum(body)
md5HashStr := hex.EncodeToString(md5Hash[:])
// Set md5 to header
req.Header.Set("X-Md5", md5HashStr)
// Reset request body
req.Body = io.NopCloser(bytes.NewReader(body))
}
Este código primeiro verifica se o corpo da requisição não é nil. Se não for, ele lê todo o corpo usando io.ReadAll, calcula o hash MD5 usando o pacote md5 e converte o hash em uma string hexadecimal. Em seguida, ele define o cabeçalho "X-Md5" com o valor MD5 calculado. Finalmente, ele redefine o corpo da requisição para o estado original usando bytes.NewReader.
- Após adicionar o código, salve o arquivo
md5_transport.go.
Testar a Implementação
Para testar a implementação, siga estes passos:
Abra o terminal no editor.
Navegue até o diretório do projeto:
cd /home/labex/projectExecute os testes:
/usr/local/go/bin/go test
Se o código for implementado corretamente, você deverá ver a seguinte saída:
PASS
ok md5transport 0.004s
Isso indica que os testes foram aprovados e sua implementação do cálculo MD5 e da modificação do cabeçalho está funcionando conforme o esperado.
Entender a Modificação Transparente de Requisições HTTP
Em Go, frequentemente fazemos requisições de rede usando http.Client, que internamente cria um http.Request e então usa http.RoundTripper.RoundTrip para fazer a requisição real. As operações reais de transferência de dados são realizadas dentro de RoundTrip.
Ao encapsular a interface http.RoundTripper, podemos realizar várias operações na requisição e na resposta, como autenticação, estatísticas, registro de auditoria e modificação de requisições, tudo de forma transparente para o usuário.
Neste desafio, implementamos uma função simples de verificação de dados que calcula o MD5 do corpo da requisição e o adiciona ao cabeçalho da requisição. Este é apenas um exemplo de como você pode usar a interface http.RoundTripper para modificar requisições HTTP de forma transparente.
Ao projetar sua biblioteca de módulos ou usar componentes de terceiros, você pode pensar em como pode usar essa técnica para adicionar funcionalidade adicional ou modificar o comportamento de sua aplicação de forma transparente.
Resumo
Parabéns! Você concluiu este projeto. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.



