2011-08-01 20 views
30

Gitmek için çok yeni. belgelerinden bu ilk hello, world çalıştı ve isteğinden Host ve Scheme okumak istedim:Neden request.URL.Host ve Scheme geliştirme sunucusunda boştur?

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) 
} 

Ama değerler hem boş. Niye ya? Eğer bir HTTP vekil değil, HTTP sunucusunu erişiyorsunuz beri

cevap

45

Temelde, bir tarayıcı gibi pek göreli bir HTTP isteği olabilir:

GET/HTTP/1.1 
Host: localhost:8080 

(tabii ki, sunucu dinliyor, göz önüne alındığında localhost portunda 8080). tarafından ayrıştırılır olarak (ham URL'yi Her iki durumda da

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

, sen git en http.Request.URL ne olsun edilmektedir: Eğer erişiyormuş

Şimdi, proxy kullanarak sunucu, vekil mutlak URL kullanabilirsiniz söyledi kütüphane). Aldığınız durumda, URL'ye göreli bir yoldan erişiyorsunuz, dolayısıyla URL nesnesinde Ana Bilgisayar veya Şema eksikliği.

HTTP ana bilgisayarını almak istiyorsanız, http.Request yapısının Host özniteliğine erişmek isteyebilirsiniz. Bkz http://golang.org/pkg/http/#Request

Sen netcat ve uygun şekilde biçimlendirilmiş bir HTTP isteği kullanarak (Eğer yukarıdaki blokları kopyalamak bir sondaki boş bir satır dosyanıza sonra olmadığından emin yapabilirsiniz) doğrulayabilmeniz. Denemek için:

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

Ayrıca, sen IsAbs() yöntemini çağırarak istekte göreli veya mutlak URL almak ister sunucu/işleyicisindeki kontrol edebilir: İlginç

isAbsoluteURL := r.URL.IsAbs() 
+0

. Çok detaylı olduğun için teşekkürler. Bununla birlikte, dev sunucusunu kullanırken bu durumun mevcut olmaması biraz garip (geliştirme sunucusunun, isteği doldurmak için bir çeşit ana ortam kurmasını tahmin ediyorum). request.Host iş yaptı ama URL.Scheme kullanmak için dev sunucusu kullanılıyorsa veya kullanılmıyorsa koşullu kontrol etmeliyim. – moraes

+3

Cevabınız için teşekkürler! Bu davranışı nasıl önleyeceğinizi anlatabilir misiniz (URL ayrıştırmada baş ağrısı)? Istemeden bile bulamıyor çünkü Request nesnesinden :(Bu normal mi? –

+0

Bazen botları bu şekilde görebildiğinize dikkat edin (bir sayfa talep ederken tam URL'yi kullanırlar.) – Xeoncross

İlgili konular