我在Go上的Google App Engine上遇到urlfetch的超时问题。该应用似乎不想花费超过5秒的超时时间(它忽略了更长的超时并在自己的时间后超时)。
我的代码是:
var TimeoutDuration time.Duration = time.Second*30 func 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秒钟后超时。如何防止它这样做?我的代码有错误吗?
TimeoutDuration
您需要像这样传递持续时间(否则它将默认为5秒超时):
tr := &urlfetch.Transport{Context: c, Deadline: time.Duration(30) * time.Second}
2016年1月2日更新:
有了新的GAE golang软件包(google.golang.org/appengine/*),情况已经改变。urlfetch不再在运输中收到最后期限持续时间。
google.golang.org/appengine/*
urlfetch
现在,您应该通过新的上下文包设置超时。例如,这是您设置1分钟期限的方式:
func someFunc(ctx context.Context) { ctx_with_deadline, _ := context.WithTimeout(ctx, 1*time.Minute) client := &http.Client{ Transport: &oauth2.Transport{ Base: &urlfetch.Transport{Context: ctx_with_deadline}, }, }