Maison > développement back-end > Golang > le corps du texte

Gestion des réponses HTTP en streaming

王林
Libérer: 2024-02-09 15:00:11
avant
493 Les gens l'ont consulté

处理流式 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)

    }
}
Copier après la connexion

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
}
Copier après la connexion

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)
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!