首頁 >後端開發 >Golang >處理串流 HTTP 回應

處理串流 HTTP 回應

王林
王林轉載
2024-02-09 15:00:11527瀏覽

处理流式 HTTP 响应

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在循環中斷後完成。

該程式確實有錯誤:

  • 程式僅在 EOF 時跳出迴圈。如果出現任何其他類型的錯誤,程式將永遠旋轉。
  • 程式不處理 ReadBytes 傳回資料和錯誤的情況。可能發生這種情況的一個範例是回應不以分隔符號結尾。

看起來您的目標是吸收對 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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除