Go调用http.ReadRequest解析请求字符串报unexpected EOF如何解决
问题解决方案
报错原因
http.ReadRequest严格遵循HTTP/1.1协议规范解析原始请求报文,触发unexpected EOF报错是因为你的请求字符串不符合协议要求,具体有两个问题:
- 标准HTTP请求报文结构要求:请求行+所有请求头结束后,必须加一组空行(即
\r\n\r\n)作为头部分隔标识,哪怕没有自定义请求头也必须保留这个空行,否则解析器无法判断请求头是否读取完成,就会抛出EOF错误 - 服务端接收的原始请求行格式中,请求方法后跟随的是资源路径,不是完整请求URL,完整URL是客户端构造外发请求时才会使用的格式,直接传入会导致解析失败
修复方案
方案1:修正原始请求报文格式
调整请求字符串符合HTTP/1.1规范,示例代码如下:
package main import ( "bufio" "net/http" "strings" ) func main() { // 请求行用资源路径,补充Host头,末尾加空行标识请求头结束 s := `GET /get HTTP/1.1 Host: httpbin.org ` req, err := http.ReadRequest(bufio.NewReader(strings.NewReader(strings.ReplaceAll(s, "\n", "\r\n")))) if err != nil { panic(err) } println(req.Method, req.Host, req.URL.Path) }
方案2:使用更适合客户端场景的请求构造方法
如果你只是需要构造HTTP请求用于后续发送,更推荐直接使用Go标准库提供的http.NewRequest方法,不需要手动拼写原始报文,天然支持传入完整URL:
package main import ( "net/http" ) func main() { req, err := http.NewRequest(http.MethodGet, "https://httpbin/get", nil) if err != nil { panic(err) } // 后续可直接通过http.Client发送该请求 println(req.Method, req.Host, req.URL.Path) }
内容的提问来源于stack exchange,提问作者Alex1234
相关产品推荐
相关产品推荐

