当前位置: 首页 > 面试题库 >

net / http:http:ContentLength = 222,正文长度为0

崔绍辉
2023-03-14
问题内容

如果存在连接/代理错误,我正在尝试重试请求。由于某些原因,我不断收到此错误,无论尝试重试该请求,该错误似乎都无法恢复:

    Post https://m.somewebsite.co.uk/api/di/34433: http: ContentLength=222  with Body length 0

难道我做错了什么?我的第一个怀疑是http.Request以某种方式被消耗了,因此在下一次尝试中它不再是好东西。我应该管理副本吗?

func Post(URL string, form url.Values, cl *http.Client) ([]byte, error) {
    req, err := http.NewRequest("POST", URL, strings.NewReader(form.Encode()))
    if err != nil {
        log.Error(err)
        return nil, err
    }
    req.Header.Set("User-Agent", ua)
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
    rsp, err := do(cl, req)

    if err != nil {
        return nil, err
    }
    defer rsp.Body.Close()
    b, err := ioutil.ReadAll(rsp.Body)
    if err != nil {
        log.Error(err)
        return nil, err
    }

    return b, nil
}

func do(cl *http.Client, req *http.Request)(*http.Response, error){
    rsp, err := cl.Do(req)
    for i := 0; IsErrProxy(err); i++ {
        log.Errorf("Proxy is slow or down ")
        time.Sleep(6 * time.Second)
5t      rsp, err = cl.Do(&ncp)
        if err == nil{
            return rsp, nil
        }
        if i > 10 {

            return nil, fmt.Errorf("after %v tries error: %v", i, err)
        }
    }
    return rsp, err
}

问题答案:

问题在于在第一次调用Do()时将请求主体读到末尾。在随后对Do()的调用中,没有从响应主体读取任何数据。

解决方法是将主体阅读器的创建移到for循环内。这要求在for循环内也创建请求。

func Post(URL string, form url.Values, cl *http.Client) ([]byte, error) {
  body := form.Encode()
  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-urlencoded")
    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)
}


 类似资料:
  • 我正在开发一个服务,它将使用HTTP Content-Type:application/octet-stream和Transfer-Encoding: chunked接收文件。 我能够让服务器获取请求DisableFormValueModelBinda和Request estSizeLimit。 但是当我去从Request.Body获取数据时,长度总是0。 在框架中,我将使用类似request.C

  • 大家好,我正在构建一个聊天服务器,我在屏幕上使用一个文本字段来键入用户写的聊天消息,这个想法是,当他键入消息时,它就像一个泡泡在一个人的头上一样工作。 我的问题是,为了不使文本框太大或太小,有没有一种方法可以使文本框调整大小(如果你愿意,可以修剪),以便它调整到文本字段中所写的文本? 附言。我使用JavaFx scenebuilder来完成所有这些。

  • 下面的代码给出了最长的回文子序列长度。如何修改代码以获得最长的回文子串长度? 下面是一个示例调用:

  • 问题内容: 我正在尝试将JSON参数发送到我的服务器,并使用json.Decoder解析它们。我读到您应该能够从request.Body属性获取查询参数。以下是我的服务器代码: 每次,我都会看到(当然是不同的时间戳记)。我的客户端AJAX调用如下: 发送内容的示例URL: 更好看一下参数: 我已经尝试了GET和POST请求。 为什么我的req.Body从不解码?如果我尝试单独打印req.Body,

  • 有人能解释一下这个错误吗? 这是我的日志。

  • 我正在尝试构建一个正则表达式,它接受具有以下条件的域名: 允许DNS名称(仅允许连字符、句点和字母数字字符)最多255个字符 连字符只能出现在字母之间 应该以字母开头,以字母结尾。它至少有3个字符(字母和句点必填,连字符可选)。 周期前标签的长度应为63 可能的情况: a、 b.c a-a.b 不该通过的案子 a-b q wert q wert q wert q wert q wert q wer