go request请求url传参/head设置和处理响应中的大量数据

3,865 阅读1分钟

1.发送请求获取数据,并缓存到buffer

//获取数据并缓存到buffer
func GetData() (*bytes.Buffer, error)  {
	var(
		url string
		err error
		req *http.Request
		res *http.Response
		client *http.Client
		buffer *bytes.Buffer
	)
	
	//构造request
	url = "https://ea.azure.cn/rest/V5l##333333/usage-report"
	if req, err = http.NewRequest("GET", url, nil); err !=nil{
		return nil, err
	}
	//添加get请求参数
	values := req.URL.Query()
	values.Add("month", "2019-7")
	values.Add("type", "detail")
	//values.Add("fmt", "Json")
	values.Add("fmt", "csv")
	//编译请求参数
	req.URL.RawQuery = values.Encode()
	//设置请求head
	req.Header.Set("Authorization", "bearer acaklkjlabacddjlejoi")
	req.Header.Set("api-version", "2016-08-31")

	
	
	//构造客户端,发送请求
	client = &http.Client{}
	if res, err = client.Do(req); err !=nil{
		return nil, err
	}

	//关闭res.Body
	defer func() {
		if err=res.Body.Close(); err!=nil{
			return
		}
	}()
	
	//判断请求是否成功
	if res.StatusCode == 200 {
		fmt.Println("请求成功")
		//创建缓存器buffer,当数据大于4096时,缓存器会自动增加大小,直到将所有数据拷贝完
		buffer = bytes.NewBuffer(make([]byte, 4096))
		//将res.Body拷贝到缓存器buffer
		if _, err = io.Copy(buffer, res.Body); err != nil {
			fmt.Println("io.copy err: ", err)
		}
	}
	return buffer, nil
}

2. 按行读取缓存器中的数据

//从buffer中获取数据
func ReadBuffer(buffer *bytes.Buffer)  {
	var(
		str string
		err error
	)
	
	for{
		//按行读取缓存器buffer
		if str, err = buffer.ReadString('\n'); err!=nil{
			//判断是否获取完毕
			if err == io.EOF{
				fmt.Println("获取完毕")
				break
			}else {
				fmt.Println(`*buffer.ReadString('\n') err: `, err)
			}
		}
		fmt.Println("获取到的内容是:", str)
	}
	
	//清空buffer
	buffer.Reset()
}