go 解释get stream流式数据

2019-10-15  本文已影响0人  hugoren

代码

func ReqStream(url string) {

    client := &http.Client{}
    request, err := http.NewRequest("GET", url, nil)
    if err != nil {
        fmt.Println(err)
    }
    //设置request的header
    request.Header.Set("Content-Type", "text/event-stream")
    request.Header.Set("Accept-Charset", "utf-8")
    request.Header.Set("Connection", "keep-alive")
    response, err := client.Do(request)
    if err != nil {
        fmt.Println(err)
        return
    }
    //defer response.Body.Close()

    if response.StatusCode == 200 {
        buf := make([]byte, 4096)
        for {
            n, err:= response.Body.Read(buf)
            if err != nil || n == 0{
                fmt.Println("出现错误")
                //break
            }
            result := string(buf[:n])
            print(result)
        }
    }
}

效果

[图片上传中...(image.png-9f576e-1571110481788-0)]

改进

这样写,没有解决类似的粘包的问题,需优化。

func StreamLine(url string){
    resp, err := http.Get(url)
    if err != nil {
        fmt.Println(err)
    }
    reader := bufio.NewReader(resp.Body)
    for {
        line, err := reader.ReadBytes('\n')
        if err != nil {
            fmt.Println(err)
        }
        data := string(line)
        match, _ := regexp.MatchString("data", data)
        if match {
            data_slice := string([]byte(data)[6:])
            fmt.Println(data_slice)
        }

    }
}

#### 对比评论
go 天生的高并发,速度快,相对py相对,同样一个stream请求,py就简单多了

def get_stream(url):
    result = requests.get(url, stream=True)
    while 1:
        for chunk in result.iter_content(1024):
            print(chunk)

参考:
https://blog.csdn.net/Hello_Ray/article/details/93332867

https://stackoverflow.com/questions/22108519/how-do-i-read-a-streaming-response-body-using-golangs-net-http-package

上一篇 下一篇

猜你喜欢

热点阅读