报错信息如下:
原因:
在请求体为json的请求中,调用了parsePostForm方法,方法大致内容如下:
在这个方法中,会读取http的请求体.
今天这一节被读取的时候,后面又重新读取一次,之后解json
后面读到的请求体是空的,解json的时候就会报错EOF
总结:golang中http请求报错eof,多半是因为多次读取了请求体
先构建newTextprotoReader,由于缓冲区是对象复用的,用完后要defer put.共完以以下解析任务:
TextprotoReader数据结构,将字节码Reader转成文本Reader.
第一步,从第一行解析出method uri prototype.
第二步解析URL.url.URL数据结构:
解析Scheme,协议前缀(小写).有查询参数?,则配置url.ForceQuery url.RawQuery.有认证信息///...//,则解析url.User url.Host.最后配置url.Path和url.RawPath,如果Path==RawPath,则RawPath="".
第三步解析MIMEHeader.
第四步readTransfer.重新配置如下参数:RequestMethod ProtoMajor ProtoMinor Header Trailer ContentLength Close.对于Body,如果encodings支持chunked,读取流用chunkedReader包裹.默认情况用LimitedReader,无body赋空的struct{}.
以下情况返回非空err,示得到正确的请求:
最后配置req.ctx req.RemoteAddr req.TLS body.doEarlyClose = true.
构建Response:
其中closeNotifyCh必须在构建时初始化,没有content所以先置contentLength为-1.
获取Request可能出现如下错误:
先上响应数据结构:
response字段可以分类为:大对象、缓冲、KV对或bool型的状态参数.
大对象有:
状态字段:
chunkWriter数据结构:
chunkWriter包裹了Response,功能之一是完成Header设置,包括Content-Type Content-Length chunk-header.bufio.Writer是chunkWriter是缓冲包裹.
handler将响应写入到response.w.
调用w.w.Flush()将w写入到cw,注意到Flush()操作,如果未刷空缓存并报错,触发拷贝操作.报错不会退回已写出的数据.
进而调用cw.Write(),根据cw.chunking参数.
putBufioWriter(w.w)清空resp.w缓冲,如果池化放回sync.pool.
根据chunkWriter的定义,w.cw.close()负责cw的结束工作:写入换行符和resp.trailers数据.
最后刷新TCP缓冲w.conn.bufw.Flush(),完成响应包发送.并正确关闭request.
①在后端服务开发中,如过一个HTTP请求,请求一致占用,将会带来大的性能影响,所以需要为每个请求加上超时设置
以上就是土嘎嘎小编为大家整理的go语言调用http请求的简单介绍go语言调用http请求的简单介绍相关咨询咨询主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!