Go 서버의 HTTP 청크 응답
이 시나리오에서는 청크 HTTP 응답을 보내는 Go HTTP 서버를 만드는 것을 목표로 합니다. 전송 인코딩이 "청크"로 설정되었습니다. 서버는 클라이언트가 요청 시 청크를 수신할 수 있도록 1초 간격으로 청크를 작성하려고 합니다. 그러나 현재 구현은 문제에 직면합니다.
서버 코드
제공된 서버 코드는 다음과 같습니다.
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") }
해결 방법
문제 해결 방법:
수정됨 코드
import ( "fmt" "io" "log" "net/http" "time" ) func main() { http.HandleFunc("/", func(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") for i := 1; i <= 10; i++ { fmt.Fprintf(w, "Chunk #%d\n", i) flusher.Flush() // Trigger "chunked" encoding and send a chunk... time.Sleep(500 * time.Millisecond) } }) log.Print("Listening on localhost:8080") log.Fatal(http.ListenAndServe(":8080", nil)) }
확인
텔넷을 사용하여 서버에 연결합니다.
$ telnet localhost 8080 ... HTTP/1.1 200 OK Date: ... Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked 9 Chunk #1 9 Chunk #2 ...
각 청크는 다음과 같이 점진적으로 수신됩니다. 서버에서 보냅니다.
위 내용은 My Go HTTP 서버가 청크 응답을 점진적으로 보내지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!