在请求 URL 中使用绝对值 URL 进行 HTTP 请求

Make HTTP Request with an absolute URL in the Request URL

我想知道是否可以使用 Go 的 net/http 库发出如下请求:

GET http://test2.com/thisisatest HTTP/1.1
Host: test1.com

澄清一下,如果我向本地主机发送请求,我不想更改主机 header,如:

nc -lnvp 8001
listening on [any] 8001 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 55122
GET /headers HTTP/1.1
Host: not-localhost
User-Agent: Go-http-client/1.1
Content-Type: application/json
Accept-Encoding: gzip

但我打算在请求行中包含完整的 URL:

nc -lnvp 8001
listening on [any] 8001 ...
connect to [127.0.0.1] from (UNKNOWN) [127.0.0.1] 55122
GET http://localhost/headers HTTP/1.1
Host: localhost
User-Agent: Go-http-client/1.1
Content-Type: application/json
Accept-Encoding: gzip

我似乎找不到任何关于它的信息。如果无法使用 net/http,是否还有其他可行的方法?

谢谢!

迭戈

不,我们无法使用 net/http 撤消,因为 net/http 实现了 HTTP 而您想要做的根本不是 HTTP。

If it's not possible using net/http is there any other way that this would be doable?

做原始网络,即使用 package net。

这是错误的。对不起。

来自 https://pkg.go.dev/net/http#Request.Host,

// For client requests, Host optionally overrides the Host
// header to send. If empty, the Request.Write method uses
// the value of URL.Host. Host may contain an international
// domain name.

所以您应该能够制作您的请求,将其 Host 字段设置为您想要的任何内容,然后发出请求。

考虑以下代码。 It doesn't work on the Playground(不允许外部连接)但应该可以在您的工作站上工作。

package main

import (
    "io"
    "net/http"
    "os"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://httpbin.org/headers", nil)
    if err != nil {
        panic(err)
    }
    req.Host = "myserver.com"
    req.Header.Add("Content-Type", `application/json`)
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    } else if _, err := io.Copy(os.Stdout, resp.Body); err != nil {
        panic(err)
    }
}

https://httpbin.org/headers returns headers 与请求一起发送,因此这是一种验证此工作的有用方法。我的结果:

{
  "headers": {
    "Accept-Encoding": "gzip",
    "Content-Type": "application/json",
    "Host": "myserver.com",
    "User-Agent": "Go-http-client/2.0",
    "X-Amzn-Trace-Id": "Root=1-6217a78b-27317e7e06a097cb293b5db1"
  }
}

如您所见,由于我设置了请求主机,http 库并没有从 URL.

中设置它

在这种情况下,httpbin 请求处理程序不介意请求 header 与 url 不匹配。如果主机 header 不匹配,其他站点可能 return a 400 Bad Request

请注意,您不能通过直接操纵 Host header 来实现相同的目的。您必须使用 Request.Host.