使用 HTTP.Handler 检查正文时保留请求状态
在实现 HTTP 处理程序的上下文中,使用以下方法访问请求正文req.ParseForm() 可能会造成一个困境。虽然这种检查通常是必要的,但它可能会耗尽请求的正文流,使其无法用于后续处理程序(例如反向代理)。
问题:耗尽正文流
当通过调用 req.ParseForm() 等方法消耗请求正文时,req.Body.Reader 流将被耗尽,没有为下游处理程序留下任何剩余数据。这会导致代理转发时出现错误,因为预期的请求正文长度不再与耗尽状态匹配。
解决方案:拆分正文流
克服此挑战,可以采用涉及缓冲层的技术。通过将请求正文读入缓冲区并使用该缓冲区创建多个新读取器,我们可以将检查与原始正文流分开。
步骤:
示例:
buf, _ := io.ReadAll(r.Body) rdr1 := io.NopCloser(bytes.NewBuffer(buf)) rdr2 := io.NopCloser(bytes.NewBuffer(buf)) doStuff(rdr1) r.Body = rdr2
好处:
以上是如何检查 HTTP 请求正文而不丢失后续处理程序的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!