我在世界各地有 N 个代理商。我需要通过这些代理调用一些端点,但不加载它们的主体。 例如,我想调用 google.com,我将此 url 发送给所有 N 个代理,然后他们使用 GET 方法向 google.com 发送一个 http 请求,然后将响应发送给我。 问题是所有代理都正在加载完整的正文响应,但我只需要响应状态和 header 。 Golang 中是否有任何解决方案可以防止首先下载正文响应?
我尝试使用一些curl标志调用它,但它只是忽略显示响应正文并在后台下载正文
最佳答案
您想要实现的目标与 HTTP 协议(protocol)不兼容。
抛开 HEAD 与 GET 不谈,让我们从独立于语言/实现的角度来看待这个问题。
无论实现如何,您的 HTTP 客户端都会使用 GET/POST/PUT 方法向服务器发送 HTTP/1.1 请求。接下来发生的事情是服务器收到此请求,其负载如下(假设是 GET,但对所有负载都是相同的):
GET /somepath HTTP/1.1
Host: somedomain.com
<more request headers here>
此时,服务器将回复 HTTP 响应 header 和 HTTP 响应正文。没有办法阻止这种情况发生,因为它实际上会破坏 HTTP 协议(protocol)。您始终可以避免在客户端读取响应正文,但响应正文将始终“通过线路”传输。
但是,对于 POST/PUT(需要发送请求正文的方法),您可以使用 Expect
header 。
如果您在请求中包含 Expect: 100-continue
header ,则服务器将向您发回 HTTP 100 Continue
响应,向客户端发出信号:很明显要发送请求体,此时就可以断开连接了。
但是,这意味着如果您发送了请求正文,您将无法获得将发送的实际 HTTP 响应代码。例如,如果您的有效负载无效,您不会收到 HTTP 400 错误请求,因为您实际上没有发送有效负载。如果您发送了有效负载,那么服务器将发回完整的响应,包括正文。
不幸的是,您想要实现的目标是不可能的。
关于Go:如何在不加载正文的情况下创建 http 代理通行证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76774512/