>백엔드 개발 >Golang >스트리밍 HTTP 응답 처리

스트리밍 HTTP 응답 처리

王林
王林앞으로
2024-02-09 15:00:11527검색

处理流式 HTTP 响应

PHP 편집자 Zimo가 스트리밍 HTTP 응답을 처리하는 방법을 소개합니다. 웹 애플리케이션을 개발할 때 대용량 파일을 다운로드하거나 실시간 스트리밍 미디어를 전송해야 하는 경우가 많습니다. 전체 응답 내용을 한 번에 로드하는 전통적인 방법은 과도한 메모리 사용량을 유발하고 성능에 영향을 미칩니다. 이 문제를 해결하기 위해 스트리밍 HTTP 응답을 사용할 수 있습니다. 스트리밍 HTTP 응답은 응답 콘텐츠를 청크로 전송하여 메모리 사용량을 줄이고 사용자 경험을 향상시킬 수 있습니다. PHP에서는 일부 라이브러리나 사용자 지정 메서드를 사용하여 스트리밍 HTTP 응답을 구현하여 웹 애플리케이션을 최적화할 수 있습니다.

질문 내용

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)

    }
}

해결책

프로그램의 버그를 무시하고 rb루프가 중단된 후 완료하세요.

이 프로그램에는 버그가 있습니다:

  • 프로그램은 EOF에서만 루프에서 벗어납니다. 다른 종류의 오류가 발생하면 프로그램은 영원히 회전합니다.
  • ReadBytes가 데이터를 반환하고 오류가 발생하는 상황을 프로그램에서 처리하지 않습니다. 이런 일이 발생할 수 있는 예는 응답이 구분 기호로 끝나지 않는 경우입니다.

귀하의 목표는 rb에 대한 전체 응답을 흡수하는 것인 것 같습니다. io.ReadAll을 사용하여 다음을 수행하세요.

으아악

응답 본문을 JSON으로 디코딩하려는 경우 JSON 디코더가 응답 본문을 읽도록 하는 더 좋은 방법은 다음과 같습니다.

으아악

위 내용은 스트리밍 HTTP 응답 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제