代码
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
网友评论