我在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提供
Smart猫小萌
TA贡献1911条经验 获得超7个赞
对我来说,这行得通:
ctx_with_deadline, _ := context.WithTimeout(ctx, 15*time.Second) client := urlfetch.Client(ctx_with_deadline)
- 3 回答
- 0 关注
- 254 浏览
添加回答
举报
0/150
提交
取消