Rumah > pembangunan bahagian belakang > Golang > Mengapa Pelayan HTTP My Go Hanya Menghantar Data Potongan Selepas Kelewatan, dan Bagaimana Saya Boleh Menetapkan Panjang Kandungan kepada 0?

Mengapa Pelayan HTTP My Go Hanya Menghantar Data Potongan Selepas Kelewatan, dan Bagaimana Saya Boleh Menetapkan Panjang Kandungan kepada 0?

Barbara Streisand
Lepaskan: 2024-12-04 08:12:13
asal
426 orang telah melayarinya

Why Does My Go HTTP Server Only Send Chunked Data After a Delay, and How Can I Set Content-Length to 0?

Respons HTTP Chunked Berterusan daripada Pelayan Go

Dalam usaha untuk mencipta pelayan HTTP Go yang menghantar cebisan data secara berterusan, anda telah menghadapi cabaran. Daripada menerima potongan seperti yang dimaksudkan setiap saat, pelanggan anda hanya menerima keseluruhan respons selepas tempoh 5 saat. Selain itu, anda ingin menghantar pengepala Panjang Kandungan sebagai 0 pada penghujung penghantaran.

Untuk menyelesaikan isu ini, adalah penting untuk menyepadukan antara muka Flusher ke dalam pelaksanaan pelayan anda. Berikut ialah versi kod anda yang dipinda:

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "time"
)

func main() {
    http.HandleFunc("/test", HandlePost)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func HandlePost(w http.ResponseWriter, r *http.Request) {
    flusher, ok := w.(http.Flusher)
    if !ok {
        panic("expected http.ResponseWriter to be an http.Flusher")
    }
    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)
            flusher.Flush()
        }
    }()
    time.Sleep(time.Second * 5)
    ticker.Stop()
    fmt.Println("Finished: should return Content-Length: 0 here")
    w.Header().Set("Content-Length", "0")
}
Salin selepas log masuk

Dengan menggunakan Flusher.Flush() selepas setiap bahagian ditulis, anda mencetuskan pengekodan "chunked" dan menghantar potongan individu. Ini memastikan pelanggan menerima data apabila ia tersedia.

Mengesahkan tingkah laku ini boleh dicapai melalui telnet, seperti yang ditunjukkan di bawah:

$ telnet localhost 8080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1

HTTP/1.1 200 OK
Date: Tue, 02 Jun 2015 18:16:38 GMT
Content-Type: text/plain; charset=utf-8
Transfer-Encoding: chunked

9
Chunk #1

9
Chunk #2

...
Salin selepas log masuk

Kod yang diubah suai ini membolehkan penghantaran respons HTTP Chunked Berterusan daripada pelayan Go anda. Ingat untuk mengesahkan bahawa ResponseWriters anda menyokong akses serentak merentas berbilang goroutine untuk prestasi optimum.

Atas ialah kandungan terperinci Mengapa Pelayan HTTP My Go Hanya Menghantar Data Potongan Selepas Kelewatan, dan Bagaimana Saya Boleh Menetapkan Panjang Kandungan kepada 0?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan