在请求 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
.
我想知道是否可以使用 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
.