Maison  >  Article  >  développement back-end  >  Gestion des réponses HTTP en streaming

Gestion des réponses HTTP en streaming

王林
王林avant
2024-02-09 15:00:11511parcourir

处理流式 HTTP 响应

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.

Contenu de la question

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)

    }
}

La solution

ignore le bug dans le programme et rbcomplète une fois la boucle interrompue.

Ce programme a des bugs :

  • Le programme ne sort de la boucle qu'à EOF. Si un autre type d'erreur se produit, le programme tournera pour toujours.
  • Le programme ne gère pas la situation dans laquelle ReadBytes renvoie des données et des erreurs. Cela peut par exemple se produire si la réponse ne se termine pas par un délimiteur.

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer