为了账号安全,请及时绑定邮箱和手机立即绑定

GAE Golang-网址提取超时?

GAE Golang-网址提取超时?

Go
白猪掌柜的 2021-05-14 18:19:16
我在Go上的Google App Engine上遇到urlfetch的超时问题。该应用似乎不希望花费超过5秒的超时时间(它忽略了更长的超时并在自己的时间后超时)。我的代码是:var TimeoutDuration time.Duration = time.Second*30func Call(c appengine.Context, address string, allowInvalidServerCertificate bool, method string, id interface{}, params []interface{})(map[string]interface{}, error){    data, err := json.Marshal(map[string]interface{}{        "method": method,        "id":     id,        "params": params,    })    if err != nil {        return nil, err    }    req, err:=http.NewRequest("POST", address, strings.NewReader(string(data)))    if err!=nil{        return nil, err    }    tr := &urlfetch.Transport{Context: c, Deadline: TimeoutDuration, AllowInvalidServerCertificate: allowInvalidServerCertificate}    resp, err:=tr.RoundTrip(req)    if err != nil {        return nil, err    }    defer resp.Body.Close()    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        return nil, err    }    result := make(map[string]interface{})    err = json.Unmarshal(body, &result)    if err != nil {        return nil, err    }    return result, nil}无论我尝试设置什么TimeoutDuration,该应用程序都会在大约5秒钟后超时。如何防止它这样做?我在代码中犯了一些错误吗?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

请尝试以下代码:


// createClient is urlfetch.Client with Deadline

func createClient(context appengine.Context, t time.Duration) *http.Client {

    return &http.Client{

        Transport: &urlfetch.Transport{

            Context:  context,

            Deadline: t,

        },

    }

}

这是使用方法。


// urlfetch

client := createClient(c, time.Second*60)

由@gosharplite提供


查看完整回答
反对 回复 2021-05-24
?
Smart猫小萌

TA贡献1911条经验 获得超7个赞

对我来说,这行得通:

ctx_with_deadline, _ := context.WithTimeout(ctx, 15*time.Second)
client := urlfetch.Client(ctx_with_deadline)


查看完整回答
反对 回复 2021-05-24
  • 3 回答
  • 0 关注
  • 254 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信