在使用golang发送POST
请求的时候,由于需要发送数据,所以需要使用mime/multipart
包,不过在某次测试的时候出现了下面的错误
http2: request body larger than specified content length
很明显可以判断出错误的原因,但是错误在哪并不是很清楚,后来debug了一段时间之后,发现将创建的request
返回之后,所得到的req.Body
字段和之前有所不同,增加了一段内容,后来发现是因为用来写入body的writer
并没有关闭,使得创建的request
的ContentLength
字段和Body
中的长度不同导致,在multipart
源码中我们可以看到Close
函数的源码
func (w *Writer) Close() error {
if w.lastpart != nil {
if err := w.lastpart.close(); err != nil {
return err
}
w.lastpart = nil
}
_, err := fmt.Fprintf(w.w, "\r\n--%s--\r\n", w.boundary)
return err
}
在关闭writer之后,还会写入最后的一个boundary
,如果在创建Request
之前进行调用,那么其中的Request.ContentLength
字段会少一段最后写入的内容长度,所以writer必须在NewRequest
之前调用,否则会出现上述错误
正确示例
if err := writer.Close(); err != nil{
return nil, err
}
req, err := http.NewRequest("POST", url, &buff)
if err != nil {
fmt.Println(err)
return nil, err
}
错误示例
// 或者在创建Request之后关闭,都会出现错误!!!
defer writer.Close()
req, err := http.NewRequest("POST", url, &buff)
if err != nil {
fmt.Println(err)
return nil, err
}