php小編子墨為您介紹處理串流 HTTP 回應的方法。在開發網頁應用程式時,我們經常需要處理大檔案的下載或即時串流媒體的傳輸。而傳統的一次性載入整個回應內容的方式會導致記憶體佔用過高,影響效能。為了解決這個問題,我們可以使用串流HTTP回應。串流HTTP回應可以將回應內容分塊傳輸,減少記憶體佔用,提高使用者體驗。在PHP中,我們可以使用一些函式庫或自訂方法來實作串流HTTP響應,從而優化我們的網路應用程式。
我有以下範例,它連接到 HTTP 服務,該服務將回應以區塊流的形式傳回以建立 JSON 結構。對於每個區塊,我的程式碼附加一個位元組 rb
陣列和各個行。但是,我的問題是嘗試在 rb
完成時解決,以便我可以對其進行解碼。
我在這裡遺漏了一些明顯的東西嗎?
package main import ( "bufio" "bytes" "fmt" "io" "net/http" ) func main() { body := []byte("test") resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() fmt.Printf("Status: [%s]\n", resp.Status) fmt.Println() //var rb []byte reader := bufio.NewReader(resp.Body) var rb []byte for { line, err := reader.ReadBytes('\n') if err != nil { if err == io.EOF { break } fmt.Printf("Error reading streamed bytes %v", err) } rb = append(rb, line...) fmt.Println(rb) } }
忽略程式中的bug,rb
在循環中斷後完成。
該程式確實有錯誤:
看起來您的目標是吸收對 rb
的整個反應。使用 io.ReadAll 執行此操作:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() rb, err := io.ReadAll(resp.Body) if err != nil { // handle error } var data SomeType err = json.Unmarshal(rb, &data) if err != nil { // handle error }
如果你想將回應體解碼為 JSON,那麼更好的方法是讓 JSON 解碼器 讀取回應正文:
resp, err := http.Post("http://localhost:8281/tap", "application/json", bytes.NewReader(body)) if err != nil { fmt.Printf("%v\n", err) return } defer resp.Body.Close() var data SomeType err := json.NewDecoder(resp.Body).Decode(&data)
以上是處理串流 HTTP 回應的詳細內容。更多資訊請關注PHP中文網其他相關文章!