登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: [golang]有超时的 https 请求     [回主站]     [分站链接]
标题
[golang]有超时的 https 请求
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;    

}//



总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录
苹果推送专题 更多



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1