ホームページ  >  記事  >  バックエンド開発  >  ストリーミング HTTP 応答の処理

ストリーミング HTTP 応答の処理

王林
王林転載
2024-02-09 15:00:11513ブラウズ

处理流式 HTTP 响应

php エディター Zimo では、ストリーミング HTTP 応答を処理する方法を紹介します。 Web アプリケーションを開発する場合、多くの場合、大きなファイルのダウンロードやリアルタイム ストリーミング メディアの送信に対処する必要があります。応答コンテンツ全体を一度にロードする従来の方法では、過剰なメモリ使用量が発生し、パフォーマンスに影響を与えます。この問題を解決するには、ストリーミング HTTP 応答を使用します。 HTTP 応答をストリーミングすると、応答コンテンツをチャンクで送信できるため、メモリ使用量が削減され、ユーザー エクスペリエンスが向上します。 PHP では、いくつかのライブラリまたはカスタム メソッドを使用してストリーミング HTTP 応答を実装し、Web アプリケーションを最適化できます。

質問の内容

次の例は、応答をチャンクでストリーミングして返し、JSON 構造を作成する HTTP サービスに接続します。私のコードはブロックごとに、バイト 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)

    }
}

解決策

プログラムのバグを無視して、ループが中断された後にrbCompleteします。

このプログラムにはエラーがあります:

  • プログラムは、EOF が発生した場合にのみループから抜け出します。他の種類のエラーが発生した場合、プログラムは永久に回転します。
  • プログラムは、ReadBytes がデータとエラーを返す状況を処理できません。これが発生する可能性のある例としては、応答が区切り文字で終わっていない場合が挙げられます。

あなたの目標は、rb への応答全体を吸収することのようです。これを行うには、io.ReadAll を使用します:

リーリー

応答本文を JSON にデコードする場合は、JSON デコーダー に応答本文を読み取らせる方が良い方法です。 リーリー

以上がストリーミング HTTP 応答の処理の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。