Rumah >pembangunan bahagian belakang >Golang >Mengendalikan respons HTTP penstriman

Mengendalikan respons HTTP penstriman

王林
王林ke hadapan
2024-02-09 15:00:11526semak imbas

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

    }
}

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
}

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)

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

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam