Maison > Article > développement back-end > Gestion des réponses HTTP en streaming
L'éditeur PHP Zimo vous présente la méthode de traitement des réponses HTTP en streaming. Lors du développement d’applications Web, nous devons souvent gérer le téléchargement de fichiers volumineux ou la transmission de médias en streaming en temps réel. La méthode traditionnelle consistant à charger simultanément l’intégralité du contenu de la réponse entraînera une utilisation excessive de la mémoire et affectera les performances. Pour résoudre ce problème, nous pouvons utiliser des réponses HTTP en streaming. Les réponses HTTP en streaming peuvent transmettre le contenu de la réponse par morceaux, réduisant ainsi l'utilisation de la mémoire et améliorant l'expérience utilisateur. En PHP, nous pouvons utiliser certaines bibliothèques ou méthodes personnalisées pour implémenter des réponses HTTP en streaming afin d'optimiser nos applications Web.
J'ai l'exemple suivant, qui se connecte à un service HTTP qui diffuse la réponse en morceaux pour créer une structure JSON. Pour chaque morceau, mon code ajoute un octet rb
数组和各个行。但是,我的问题是尝试在 rb
une fois terminé afin que je puisse le décoder.
Est-ce que j'ai raté quelque chose d'évident ici ?
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) } }
ignore le bug dans le programme et rb
complète une fois la boucle interrompue.
Ce programme a des bugs :
Il semble que votre objectif soit d'absorber l'intégralité de la réponse à rb
. Utilisez io.ReadAll pour faire ceci :
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 }
Si vous souhaitez décoder le corps de la réponse en JSON, une meilleure façon est de laisser le décodeur JSON lire le corps de la réponse :
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)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!