问题在于在第一次调用Do()时将请求主体读到末尾。在随后对Do()的调用中,没有从响应主体读取任何数据。
解决方法是将主体阅读器的创建移到for循环内。这要求在for循环内也创建请求。
func Post(URL string, form url.Values, cl *http.Client) ([]byte, error) { body := form.Enpre() for i := 0; i < 10; i++ { req, err := http.NewRequest("POST", URL, strings.NewReader(body)) if err != nil { log.Error(err) return nil, err } req.Header.Set("User-Agent", ua) req.Header.Set("Content-Type", "application/x-www-form-urlenpred") rsp, err := cl.Do(req) if err == nil { defer rsp.Body.Close() b, err := ioutil.ReadAll(rsp.Body) if err != nil { log.Error(err) return nil, err } return b, nil } if !IsErrorProxy(err) { return nil, err } log.Errorf("Proxy is slow or down ") time.Sleep(6 * time.Second) } return nil, fmt.Errorf("after 10 tries error: %v", err)}


