clq
浏览(507) +
2018-07-21 13:34:49 发表
编辑
关键字:
[2018-07-21 13:36:59 最后更新]
[golang]有超时的 https 请求
虽然 golang 很强大,不过要完成这个功能没有你们想像的那么容易,幸好我已经写好了,大家可以直接用...
没试过普通 http 不过原理是一样的,大家可以自己改一下。
clq
2018-07-21 13:35:32 发表
编辑
//--------------------------------------------------
//有超时的 http 请求,单位秒
func HttpGet_TimeOut(url string, second time.Duration) ([]byte) {
defer PrintError("HttpGet_TimeOut");
//var r []byte = nil;
var c *http.Client = &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //InsecureSkipVerify参数值只能在客户端上设置有效//clq add 让客户端跳过对证书的校验
Dial: func(netw, addr string) (net.Conn, error) {
////c, err := net.DialTimeout(netw, addr, time.Second*3)
c, err := net.DialTimeout(netw, addr, time.Second * second);
if err != nil {
fmt.Println("HttpGet_TimeOut() dail timeout", err);
return nil, err;
}
fmt.Println("HttpGet_TimeOut 连接成功 ..."); //test 仍然有卡死的情况
//clq add 似乎可以在这里设置整个通话过程中的时间,超时
SetConnectTimeOut(c, 10);//test add
//c.SetDeadline( //其实这样也可以
return c, nil;
},
MaxIdleConnsPerHost: 10,
////ResponseHeaderTimeout: time.Second * 2,
ResponseHeaderTimeout: time.Second * second, //这个应该指的是读取头信息时的超时
//IdleConnTimeout: time.Second * second, //test 据说 可以控制连接池中一个连接可以idle多长时间
IdleConnTimeout: time.Second * 60, //test add 据说 可以控制连接池中一个连接可以idle多长时间
},
}
//c.Get(url);
//resp, err := http.Get(url);
fmt.Println("HttpGet_TimeOut c.Get(url) ..."); //test 仍然有卡死的情况
resp, err := c.Get(url);
fmt.Println("HttpGet_TimeOut c.Get(url)end ..."); //test 仍然有卡死的情况
if err != nil {
fmt.Println("error:", err);
return nil;
}
defer resp.Body.Close(); //一定要有
fmt.Println("HttpGet_TimeOut ioutil.ReadAll ..."); //test 仍然有卡死的情况
//resp.Header
fmt.Println(resp.Header.Get("Content-Length")); //test
fmt.Println(resp.Header.Get("Date")); //test
fmt.Println(resp.Header); //test
fmt.Println("resp.ContentLength: ", resp.ContentLength); //test //https://www.bitstamp.net/api/ticker/ 没有这个头,也许是这个原因导致后面的 ioutil.ReadAll 无效
body, err := ioutil.ReadAll(resp.Body); //就是这里卡的
fmt.Println("HttpGet_TimeOut ioutil.ReadAll end ..."); //test 仍然有卡死的情况
//fmt.Println(string(body));
if err != nil {
fmt.Println("error:", err);
return nil;
}
//return r;
return body;
}//
NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.