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:
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
$ 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.
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