"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué los servidores GO HTTP no envían respuestas fragmentadas progresivamente?

¿Por qué los servidores GO HTTP no envían respuestas fragmentadas progresivamente?

Publicado el 2025-04-14
Navegar:941

Why Doesn't My Go HTTP Server Send Chunked Responses Progressively?

http responde desde un servidor GO

en este escenario, nuestro objetivo es crear un servidor GO HTTP que envíe una respuesta HTTP cortada con la transferencia de transferencia establecida en "Chunked". El servidor tiene la intención de escribir fragmentos a intervalos de un segundo, lo que permite que el cliente los reciba a pedido. Sin embargo, la implementación actual enfrenta desafíos:

  1. el cliente está recibiendo todos los fragmentos a la vez en lugar de progresivamente como intencionados.
  2. el encabezado de contenido-longitud se establece automáticamente por GO, que queremos ser 0 y agregado en el final.
[&] [&] [&] Code [&] El código del servidor proporcionado es el siguiente:

func handttp.ResponseWriter, r *http.request) { W.Header (). Set ("Conexión", "Keep-Alive") W.Header (). Set ("Transfer-Engoding", "Chunked") W.Header (). Set ("X-Content-Type-Options", "Nosniff") Ticker: = Time.NewTicker (Time.second) Go func () { para t: = range ticker.c { io.writeString (W, "Chunk") fmt.println ("tick at", t) } } () Time.sleep (Time.second * 5) ticker.stop () fmt.println ("terminado: debería devolver el contenido-longitud: 0 aquí") W.Header (). Set ("Content-longitud", "0") }

solución

func HandlePost(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Connection", "Keep-Alive")
    w.Header().Set("Transfer-Encoding", "chunked")
    w.Header().Set("X-Content-Type-Options", "nosniff")

    ticker := time.NewTicker(time.Second)
    go func() {
        for t := range ticker.C {
            io.WriteString(w, "Chunk")
            fmt.Println("Tick at", t)
        }
    }()
    time.Sleep(time.Second * 5)
    ticker.Stop()
    fmt.Println("Finished: should return Content-Length: 0 here")
    w.Header().Set("Content-Length", "0")
}
para resolver los problemas:

la interfaz "Flusher" implementada por http.esponsewriter nos permite activar el envío de fragmentos al llamar a la función folleto (). Al agregar esto después de que se escriba cada fragmento, el cliente puede recibir fragmentos como están listos.

el encabezado de transferencia de codificación es administrado automáticamente por el escritor HTTP, por lo que configurarlo explícitamente es innecesario. "FMT" "IO" "registro" "net/http" "tiempo" ) func Main () { http.handlefunc ("/", func (w http.responsewriter, r *http.request) { Flusher, OK: = w. (http.flusher) si! ok { Panic ("esperado http.ResponseWriter para ser un http.flusher") } W.Header (). Set ("X-Content-Type-Options", "Nosniff") para i: = 1; i

  1. verificación
  2. Use Telnet para conectarse al servidor:

$ Telnet Localhost 8080 ... Http/1.1 200 OK Fecha: ... Tipo de contenido: texto/simple; Charset = UTF-8 Ecodificación de transferencia: fortado 9 Trozo #1 9 Trozo #2 ... Cada fragmento se recibirá progresivamente a medida que el servidor los envíe.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3