36

私はGoが初めてです。ドキュメントからこの最初のhello, worldを試し、リクエストからホストとスキームを読みたかった:

package hello

import (
    "fmt"
    "http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Host: " + r.URL.Host + " Scheme: " + r.URL.Scheme)
}

しかし、それらの値は両方とも空白です。なんで?

4

1 に答える 1

57

基本的に、HTTP プロキシからではなく HTTP サーバーにアクセスしているため、ブラウザは次のように相対 HTTP リクエストを発行できます。

GET / HTTP/1.1
Host: localhost:8080

(もちろん、サーバーは localhost ポート 8080 でリッスンしていると仮定します)。

ここで、プロキシを使用して上記のサーバーにアクセスしていた場合、プロキシは絶対 URL を使用する場合があります。

GET http://localhost:8080/ HTTP/1.1
Host: localhost:8080

どちらの場合も、Go から得られるのhttp.Request.URLは (ライブラリによって解析された) 生の URL です。取得している場合は、相対パスから URL にアクセスしているため、URL オブジェクトにホストまたはスキームがありません。

HTTP ホストを取得したい場合Hostは、構造体の属性にアクセスすることをお勧めしますhttp.Requesthttp://golang.org/pkg/http/#Requestを参照してください

適切にフォーマットされた HTTP リクエストを使用して、それを検証netcatできます (上記のブロックをコピーできます。ファイルの後に末尾の空白行があることを確認してください)。それを試すには:

cat my-http-request-file | nc localhost 8080

IsAbs()さらに、次のメソッドを呼び出して、リクエストで相対 URL を取得するか絶対 URL を取得するかをサーバー/ハンドラーで確認できます。

isAbsoluteURL := r.URL.IsAbs()
于 2011-08-02T11:55:14.027 に答える