HTTP踩坑记录
proxy
想当然地以为访问https网站,代理地址也需要配置为https://xx.xx,修改为http://后可以使用。具体代码如下:
fixedURL, err:= url.Parse("http://username:password@devproxy.h3c.com:8080")
transport:=&http.Transport{
Proxy:http.ProxyURL(fixedURL),
}
client:=&http.Client{Transport:transport}
cookie
cookie是用来识别不同client,所以不同浏览器不同PC对应的cookie是不同的,从其他机器直接复制cookie过来有可能是不可用的。
gzip
http.request中的head是需要针对实际情况使用的,我在使用中多加了一个gzip导致服务器无法识别。。。。
json
golang在json编码时,只识别大写开头的变量,如果和json数据格式要求不一致,可通过json:"s"来标识;
且借助于标准库json的编解码,定义的结构体可以和json返回数据的结构体不完全一致,json会解析出共有的部分;
如下所示:
type respData struct{
Code int `json:"code"`
Data Data `json:"data"`
}
type Data struct{
ApName string `json:"apName"`
FailReason string `json:"failReason"`
RunTime int `json:"runTime"`
}
对应json返回数据格式:
{
"code": 0,
"message": "",
"data":{
"apSN": "219801A0WA9163Q09539",
"acSN": "210235A1JTB15C000019",
"acName": "WX5540H_1",
"apName": "2",
"apModel": "WTU420H",
"macAddr": "487a-daa0-78e0",
"apGroup": "default-group",
"radioNum": 2,
"softVersion": "E2418",
"status": 1,
"onlineTime": 410,
"runTime": 415,
"ipv4Addr": "5.0.0.55",
"failReason": " Kernel exception reboot\r\n"
}
}
打印req和resp的方式
借助于httputil的DumpResponse和DumpRequest函数可以方便的打印出req和resp的内容,如下:
temp := make([]byte, 1024)
temp, _ = httputil.DumpResponse(resp, true)
log.Println(string(temp))
获取Body内容方式
除了直接调用Read方法,还可以借助于ioutil库的ReadAll方法,如下:
body2, _ := ioutil.ReadAll(resp.Body)
本文记录了HTTP使用过程中的几个常见问题,包括代理设置、Cookie管理、Gzip压缩、JSON编码规范以及HTTP请求的调试与内容获取方法。在设置代理时要注意HTTPS与HTTP的区别;Cookie具有客户端唯一性,不能简单复制;Gzip使用不当可能导致服务器解析错误;Go语言中JSON编码要求首字母大写,可使用`json:"key"`指定字段映射;打印HTTP请求与响应内容可使用标准库函数,获取内容有多种方式。
930

被折叠的 条评论
为什么被折叠?



