为什么 Go 无法正确读取请求?

Why couldn't Go read a request properly?

我的 API 需要解析传入的请求。第一步,需要通过ioutil包的Go的ReadAll()函数来读取数据。为什么会出现错误?

official documentation没有给出提示,因为没有描述出现这种错误的原因。

func ParseRequest(w http.ResponseWriter, r *http.Request) {
    body, err := ioutil.ReadAll(r.Body)

    if err != nil {
        // handle the error
    }
}

如果客户端确实发送了无效的JSON,那是客户端的错:400 Bad Request.

如果 JSON 有效但服务器代码包含错误,则服务器错误:500 Internal Server error

ioutil.ReadAll 失败的原因有很多。它能够读取任何 io.Reader,而不仅仅是 HTTP 请求正文。而 Request.Body 只是一个 io.ReadCloser。生成一个与网络套接字以外的东西绑定的套接字对我来说是完全合法的(我一直对 http 做这些事情来构建代理和隧道协议)。

很明显,许多类型的 io.Reader 事件都可能有错误(例如,您可能无法访问文件,或者磁盘可能在读取到一半时被卸载)。特定于 HTTP,您可能同样期望出现网络故障错误。如果网络套接字在读取请求正文的过程中收到 RST 数据包,您预计会发生什么情况?

不过,最终,您应该明白的一点是您必须处理错误,因为 Reader 接口会产生错误。不要假设该接口是如何实现的。