Mengendalikan respons HTTP penstriman

王林
Lepaskan: 2024-02-09 15:00:11
ke hadapan
494 orang telah melayarinya

处理流式 HTTP 响应

Editor PHP Zimo memperkenalkan anda kepada kaedah memproses respons HTTP penstriman. Apabila membangunkan aplikasi web, kita selalunya perlu berurusan dengan memuat turun fail besar atau penghantaran media penstriman masa nyata. Kaedah tradisional memuatkan keseluruhan kandungan tindak balas sekaligus akan menyebabkan penggunaan memori yang berlebihan dan menjejaskan prestasi. Untuk menyelesaikan masalah ini, kami boleh menggunakan respons HTTP penstriman. Menstrim respons HTTP boleh menghantar kandungan respons dalam ketulan, mengurangkan penggunaan memori dan meningkatkan pengalaman pengguna. Dalam PHP, kami boleh menggunakan beberapa perpustakaan atau kaedah tersuai untuk melaksanakan penstriman respons HTTP untuk mengoptimumkan aplikasi web kami.

Kandungan soalan

Saya mempunyai contoh berikut, yang bersambung kepada perkhidmatan HTTP yang menstrimkan respons kembali dalam ketulan untuk mencipta struktur JSON. Untuk setiap bahagian, kod saya menambahkan bait rb 数组和各个行。但是,我的问题是尝试在 rb apabila selesai supaya saya boleh menyahkodnya.

Adakah saya kehilangan sesuatu yang jelas di sini?

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)

    }
}
Salin selepas log masuk

Penyelesaian

abaikan pepijat dalam program dan rbselesaikan selepas gelung terganggu.

Program ini memang mempunyai pepijat:

  • Program ini hanya keluar dari gelung di EOF. Jika sebarang jenis ralat lain berlaku, program akan berputar selama-lamanya.
  • Program ini tidak mengendalikan situasi di mana ReadBytes mengembalikan data dan ralat. Contoh di mana ini mungkin berlaku adalah jika respons tidak berakhir dengan pembatas.

Nampaknya matlamat anda adalah untuk menyerap keseluruhan tindak balas kepada rb. Gunakan io.ReadAll untuk melakukan ini:

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
}
Salin selepas log masuk

Jika anda ingin menyahkod badan tindak balas kepada JSON, cara yang lebih baik ialah membiarkan JSON penyahkod membaca badan respons:

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)
Salin selepas log masuk

Atas ialah kandungan terperinci Mengendalikan respons HTTP penstriman. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!