Heim >Backend-Entwicklung >Golang >Verarbeitung von Streaming-HTTP-Antworten

Verarbeitung von Streaming-HTTP-Antworten

王林
王林nach vorne
2024-02-09 15:00:11527Durchsuche

处理流式 HTTP 响应

Der PHP-Editor Zimo führt Sie in die Methode zur Verarbeitung von Streaming-HTTP-Antworten ein. Bei der Entwicklung von Webanwendungen müssen wir uns häufig mit dem Herunterladen großer Dateien oder der Übertragung von Echtzeit-Streaming-Medien befassen. Die herkömmliche Methode, den gesamten Antwortinhalt auf einmal zu laden, führt zu einer übermäßigen Speichernutzung und beeinträchtigt die Leistung. Um dieses Problem zu lösen, können wir Streaming-HTTP-Antworten verwenden. Durch Streaming von HTTP-Antworten können Antwortinhalte in Blöcken übertragen werden, wodurch die Speichernutzung reduziert und die Benutzererfahrung verbessert wird. In PHP können wir einige Bibliotheken oder benutzerdefinierte Methoden verwenden, um Streaming-HTTP-Antworten zu implementieren und so unsere Webanwendungen zu optimieren.

Frageninhalt

Ich habe das folgende Beispiel, das eine Verbindung zu einem HTTP-Dienst herstellt, der die Antwort in Blöcken zurückstreamt, um eine JSON-Struktur zu erstellen. Für jeden Block hängt mein Code nach Fertigstellung ein Byte rb 数组和各个行。但是,我的问题是尝试在 rb an, damit ich ihn dekodieren kann.

Übersehe ich hier etwas Offensichtliches?

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)

    }
}

Die Lösung

den Fehler im Programm ignorieren und rbabschließen, nachdem die Schleife unterbrochen wurde.

Dieses Programm hat Fehler:

  • Das Programm bricht erst bei EOF aus der Schleife aus. Wenn ein anderer Fehler auftritt, dreht sich das Programm für immer.
  • Das Programm bewältigt nicht die Situation, in der ReadBytes Daten und Fehler zurückgibt. Dies kann beispielsweise passieren, wenn die Antwort nicht mit einem Trennzeichen endet.

Es sieht so aus, als ob Ihr Ziel darin besteht, die gesamte Reaktion auf rb aufzunehmen. Verwenden Sie dazu 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
}

Wenn Sie den Antworttext in JSON dekodieren möchten, ist es besser, den JSON-Decoder den Antworttext lesen zu lassen:

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)

Das obige ist der detaillierte Inhalt vonVerarbeitung von Streaming-HTTP-Antworten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen