Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 发送正文之前的http.Client POST read响应_Go - Fatal编程技术网

Go 发送正文之前的http.Client POST read响应

Go 发送正文之前的http.Client POST read响应,go,Go,是否有方法执行client.do(“POST”,“example.com”,body)并在接收/关闭整个响应正文之前读取响应标题?这类似于JavaScript XHR请求如何发出一个事件,该事件的标题已被接收,并且您可以在请求的其余部分到达之前读取它们 我试图实现的是制作一种“智能客户端”,它使用来自服务器的头中的信息来确定要在请求主体中上载的内容。因此,我需要启动请求,读取响应头,然后开始写入请求体。由于我的系统的性质,我不能将其拆分为不同的请求。我相信这在协议级别是可能的,但我不确定go的h

是否有方法执行
client.do(“POST”,“example.com”,body)
并在接收/关闭整个响应正文之前读取响应标题?这类似于JavaScript XHR请求如何发出一个事件,该事件的标题已被接收,并且您可以在请求的其余部分到达之前读取它们


我试图实现的是制作一种“智能客户端”,它使用来自服务器的头中的信息来确定要在请求主体中上载的内容。因此,我需要启动请求,读取响应头,然后开始写入请求体。由于我的系统的性质,我不能将其拆分为不同的请求。我相信这在协议级别是可能的,但我不确定go的http库是否支持它。

您可以通过在发送实际请求和读取响应头之前向url发送
选项
请求来满足您的要求

响应标头将包含执行首选请求所需的所有标头

req,:=http.NewRequest(“OPTIONS”,“example.com”,nil)
resp,u:=client.Do(请求)

http客户端Do函数在返回整个响应正文之前不会阻塞。如果您不想阅读完整的响应,为什么不在检查完标题后使用res.Body.Close()?。我认为如果你想要大致相同的行为,它应该起作用。据博士说

响应主体在读取主体字段时按需进行流式传输。如果网络 连接失败或服务器终止响应,Body.Read调用返回错误


虽然默认http.Client(即http.Transport)的DefaultTransport不能保证它在指定之前不会读取任何字节。

虽然这在协议级别上理论上是可能的,但它会与http请求范例的响应冲突。这也可能导致代理出现问题,特别是如果代理希望在转发之前首先分析内容(即安全网关)。正确的方案是使用一个“飞行前”请求来找出服务器期望的内容,然后使用一个新的请求来提供服务器期望的内容。我同意多个请求更适合HTTP。然而,这是非常不可取的,我正试图这样做。如果我从客户端一直使用HTTPS到服务器,代理是否仍然会导致问题?代理可能会执行SSL拦截,这在公司中很常见,但在桌面防病毒软件中也经常执行。在这种情况下,使用HTTP或HTTPS实际上并不重要,因为在这两种情况下都会进行分析。简言之:最好按预期使用HTTP,不要试图发明一些快捷方式,这些快捷方式在您当前的环境和用例中工作,但在不同的情况下可能会导致意外问题。这是有道理的。这似乎与我试图解决的问题是正交的。如果我的头是在原始请求中发送的,而不是在飞行前请求中发送的,那么为什么代理更可能拦截我的头?代理更可能期望HTTP的通用语义,即发送完整请求并获得完整响应,而不是仅获取请求头,然后是响应头等等。除此之外:标准有一个特性,服务器首先发送一个临时响应头,然后是真正的头+正文。但是,客户端必须宣布对此支持,如果代理无法处理此支持,则可能会过滤此支持。有关更多信息,请参阅。正如我在问题中提到的,发送多个请求不是我的系统的选项。