net/http我想知道是否可以使用 Go 的庫發出如下請求:
GET http://test2.com/thisisatest HTTP/1.1
Host: test1.com
澄清一下,如果我向 localhost 發送請求,我不想更改主機標頭,如下所示:
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,還有其他可行的方法嗎?
謝謝!
迭戈
uj5u.com熱心網友回復:
從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欄位設定為您想要的任何內容,然后提出請求。
考慮以下代碼。 它不適用于 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回傳隨請求發送的標頭,因此這是驗證其是否有效的有用方法。我的結果:
{
"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"
}
}
如您所見,由于我設定了請求Host,因此http庫沒有從URL設定它。
在這種情況下,httpbin 請求處理程式不介意請求標頭與 url 不匹配。如果主機標頭不匹配,其他站點可能會回傳 400 Bad Request 。
請注意,您無法通過Host直接操作標頭來實作相同的目的。您必須使用Request.Host.
uj5u.com熱心網友回復:
不,這可以通過 net/http 撤消,因為 net/http 實作了 HTTP,而您想要做的根本不是 HTTP。
如果無法使用 net/http,還有其他方法可以做到嗎?
做原始網路,即使用包網路。
這是錯誤的。對不起。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432078.html
