golang在使用net/http
发送http请求时,如果请求头中包含Accept-Encoding: gzip
,且请求服务支持gzip压缩,那么在解析请求返回值时,需要手动解压
package test
import (
"bytes"
"compress/gzip"
"fmt"
"github.com/pkg/errors"
"io"
"io/ioutil"
"net/http"
"testing"
"time"
)
func TestPost(t *testing.T) {
url := "http://127.0.0.1/test/gzip"
param := "{\"gzip\": true}"
headers := http.Header{}
headers.Add("content-type", "application/json")
headers.Add("Accept-Encoding", "gzip")
entity, err := execute("POST", url, bytes.NewBufferString(param), headers)
if err != nil {
panic(err)
}
var body []byte
if !entity.Uncompressed {
// 如果返回有GZIP压缩,则需要解压
defer entity.Body.Close()
reader, err := gzip.NewReader(entity.Body)
if err != nil {
panic(err)
}
defer reader.Close()
body, err = ioutil.ReadAll(reader)
if err != nil {
panic(err)
}
} else {
defer entity.Body.Close()
body, err = ioutil.ReadAll(entity.Body)
if err != nil {
panic(err)
}
}
t.Logf("response is %s", string(body))
}
func execute(method string, url string, body io.Reader, header http.Header) (*http.Response, error) {
// 构建请求参数
request, err := http.NewRequest(method, url, body)
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("New http request error: [%s] %s", method, url))
}
request.Header = header
// 发送请求
client := http.Client{Timeout: 60 * time.Second}
resp, err := client.Do(request)
if err != nil {
return nil, errors.Wrap(err, fmt.Sprintf("Send http request error"))
}
return resp, nil
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)