我有一个函数,它使用 Go http.Client 调用外部 API,解析结果,并在之后执行的模板中使用结果。有时,外部 API 会响应缓慢(约 20 秒),模板执行会失败,引用“i/o 超时”,或者更具体地说,
template: :1:0: executing "page.html" at <"\n\t\t\t\t\t\t\t\t\...>: write tcp 127.0.0.1:35107: i/o timeout
这总是与缓慢的 API 响应相吻合,但 JSON 对象中始终存在有效响应,因此 http.Client 正在接收正确的响应。我只是想知道是否有人可以指出可能导致 ExecuteTemplate 调用中的 i/o 超时的原因。
我在客户端传输中尝试了 ResponseHeaderTimeout 和 DisableKeepAlives(有和没有这些选项)无济于事。我也尝试将请求的自动关闭值设置为 true 无济于事。模板生成代码的精简版本如下:
func viewPage(w http.ResponseWriter, r *http.Request) {
tmpl := pageTemplate{}
duration, _ := time.ParseDuration("120s")
tr := &http.Transport{
ResponseHeaderTimeout: duration,
DisableKeepAlives: true,
}
client := &http.Client{Transport: tr}
req, _ := http.NewRequest("GET", "http://example.com/some_function", nil)
req.Close = true
resp, _ := client.Do(req)
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
var res api_response // some struct that matches the JSON response
err = json.Unmarshal(body, &res)
t, _ := template.New("page.html")
err = t.ExecuteTemplate(w, "page.html", tmpl)
}