Modificación transparente de solicitudes HTTP

GolangBeginner
Practicar Ahora

Introducción

En este proyecto, aprenderás a implementar una modificación transparente de las solicitudes HTTP utilizando la interfaz http.RoundTripper de Go. Crearás un transporte HTTP personalizado que calcule el hash MD5 del cuerpo de la solicitud y lo agregue al encabezado de la solicitud como el campo "X-Md5".

👀 Vista previa

$ /usr/local/go/bin/go test
PASS
ok      md5transport    0.004s

🎯 Tareas

En este proyecto, aprenderás:

  • Cómo encapsular la interfaz http.RoundTripper para realizar operaciones personalizadas en solicitudes y respuestas HTTP.
  • Cómo calcular el hash MD5 del cuerpo de la solicitud y agregarlo al encabezado de la solicitud.
  • Cómo restablecer el cuerpo de la solicitud después de calcular el hash MD5 para mantener el estado original de la solicitud.

🏆 Logros

Después de completar este proyecto, podrás:

  • Comprender el concepto de modificación transparente de solicitudes HTTP en Go.
  • Implementar capas de transporte HTTP personalizadas que pueden realizar diversas operaciones en solicitudes y respuestas.
  • Aplicar el conocimiento para mejorar tus propias aplicaciones con funcionalidades adicionales, como autenticación, registro o manipulación de solicitudes/respuestas.

Implementar el cálculo MD5 y la modificación del encabezado

En este paso, aprenderás a implementar una función simple de verificación de datos que calcula el MD5 del cuerpo de la solicitud, lo convierte a hexadecimal y lo agrega al encabezado de la solicitud con el nombre X-Md5.

  1. Abra el archivo md5_transport.go en el editor.
  2. Agregue el contenido necesario a import.
import (
 "bytes"
 "crypto/md5"
 "encoding/hex"
 "io"
 "net/http"
)
  1. En la función RoundTrip de la estructura Transport, agregue el siguiente código para calcular el MD5 del cuerpo de la solicitud y establecerlo en el encabezado de la solicitud:
// Complete el código
// si el cuerpo de la solicitud no es nulo, calcule el md5 y agréguelo al encabezado
if req.Body!= nil {
    body, err := io.ReadAll(req.Body)
    if err!= nil {
        // Si hay un error al leer el cuerpo, devuelva la solicitud original.
        // no interrumpa la solicitud
        return t.RoundTripper.RoundTrip(req)
    }

    // Calcule el md5
    md5Hash := md5.Sum(body)
    md5HashStr := hex.EncodeToString(md5Hash[:])

    // Establezca el md5 en el encabezado
    req.Header.Set("X-Md5", md5HashStr)

    // Restablezca el cuerpo de la solicitud
    req.Body = io.NopCloser(bytes.NewReader(body))
}

Este código primero verifica si el cuerpo de la solicitud no es nulo. Si no lo es, lee todo el cuerpo utilizando io.ReadAll, calcula el hash MD5 utilizando el paquete md5 y convierte el hash a una cadena hexadecimal. Luego, establece el encabezado "X-Md5" con el valor MD5 calculado. Finalmente, restablece el cuerpo de la solicitud al estado original utilizando bytes.NewReader.

  1. Después de agregar el código, guarde el archivo md5_transport.go.

Probar la implementación

Para probar la implementación, siga estos pasos:

  1. Abra la terminal en el editor.

  2. Navegue hasta el directorio del proyecto:

    cd /home/labex/project
    
  3. Ejecute las pruebas:

    /usr/local/go/bin/go test
    

Si el código se implementó correctamente, debería ver la siguiente salida:

PASS
ok      md5transport    0.004s

Esto indica que las pruebas han pasado y que su implementación del cálculo MD5 y la modificación del encabezado está funcionando como se esperaba.

Comprender la modificación transparente de solicitudes HTTP

En Go, a menudo hacemos solicitudes de red utilizando http.Client, que internamente crea una http.Request y luego utiliza http.RoundTripper.RoundTrip para realizar la solicitud real. Las operaciones reales de transferencia de datos se realizan dentro de RoundTrip.

Al encapsular la interfaz http.RoundTripper, podemos realizar diversas operaciones en la solicitud y la respuesta, como autenticación, estadísticas, registro de auditoría y modificación de solicitudes, todo de manera transparente para el usuario.

En este desafío, hemos implementado una función simple de verificación de datos que calcula el MD5 del cuerpo de la solicitud y lo agrega al encabezado de la solicitud. Este es solo un ejemplo de cómo se puede utilizar la interfaz http.RoundTripper para modificar las solicitudes HTTP de manera transparente.

Al diseñar su biblioteca de módulos o al utilizar componentes de alguien más, puede pensar en cómo puede utilizar esta técnica para agregar funcionalidad adicional o modificar el comportamiento de su aplicación de manera transparente.

Resumen

¡Felicidades! Has completado este proyecto. Puedes practicar más laboratorios en LabEx para mejorar tus habilidades.

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar