http请求:报unexpected EOF错误

打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

背景

  1. curl --location 'http://127.0.0.1:5555/album/enjoy/list' \
  2. --header 'content-type: application/json' \
  3. --header 'Authorization: Basic ZHJlYW1lX2FwcHYxOkFQXmR2QHpAU1FZVnhOODg=' \
  4. --header 'Tenant-Id: 000000' \
  5. --header 'Dreame-Auth: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJ6UTQwMTMxOTA4IiwiVXNlck5hbWUiOiIiLCJOaWNrTmFtZSI6IiIsIkVtYWlsIjoid2FuZ2t1bkBkcmVhbWUudGVjaCIsIkJ1ZmZlclRpbWUiOjg2NDAwLCJpc3MiOiJxbVBsdXMiLCJhdWQiOlsiR1ZBIl0sImV4cCI6MTcyMjgyMzkyMCwibmJmIjoxNzIyMjE5MTIwfQ.QxeLdiO2RDHKTaE8SuVG0zAj2yCPFplqJwMpd0F4mdE' \
  6. --header 'Dreame-RLC: HICzcGYiZncM7QQKlxynIoLYEsIXq23r' \
  7. --header 'Plan: B' \
  8. --header 'dreame-api-sign: 981ccb65923b38ec2a93e6cdd344d38b' \
  9. --header 'dreame-api-timestamp: 1722231686659' \
  10. --header 'content-length: 102' \
  11. --data '{
  12.     "ids":[6579],
  13.     "report_status":2,
  14.     "timestamp":"1722231686660",
  15.     "sign":"f09d2a383b9781e15274bdeddc47ceea"
  16. }'
复制代码
  1. if c.Request.Body != nil {
  2.                 bodyBytes, _ := io.ReadAll(c.Request.Body)
  3.                 defer c.Request.Body.Close()
  4.                 if len(bodyBytes) > 0 {
  5.                         //err := json.Unmarshal(bodyBytes, &formParams)
  6.                         d := json.NewDecoder(bytes.NewReader([]byte(bodyBytes)))
  7.                         d.UseNumber()
  8.                         err := d.Decode(&formParams)
  9.                         if err != nil {
  10.                                 return "", err
  11.                         }
  12.                 }
  13.                 // 创建新的reader,使用bytes.NewReader
  14.                 // 恢复r.Body,以便可以多次读取
  15.                 r.Body = io.NopCloser(bytes.NewReader(bodyBytes))
  16.         }
复制代码
程序中有个地方需要读取body内容,打印bodyBytes的内容总是少了一截。接口还返回了unexpected EOF这个错误。之前遇到这个错误都是由于传参不是个json格式,用json在线工具验证了一下,是个正确的json格式。
题目定位

查了一下,程序中没有其他的地方执行了io.ReadAll(c.Request.Body)这个方法的地方,也不存在并发读取的情况。我把这个请求体拷贝到我的另一个程序中,没有出现读取出来的body内容被截断的情形。
这种情况可以说明传参是没有题目的,题目还是出在http底层获取body的地方。
把这个有题目的请求和调用我程序的请求对比,发现了一个不一样的地方,有题目的请求中多了一个头文件:content-length。
于是乎猜疑是这个头文件导致的。把这个头文件去掉,果然题目得以解决。
到net/http的源码中找了半天,没有找到这个逻辑。后续有时间再来探求这个逻辑。
题目原因

确保HTTP请求头中的Content-Length字段正确反映了请求体的长度。如果Content-Length不正确,服务器可能无法读取完整的请求体。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表