2011-08-01 4 views
30

मैं जाने के लिए बहुत नया हूं। यह पहली hello, world दस्तावेज़ से करने की कोशिश की, और अनुरोध से होस्ट और योजना को पढ़ने के लिए चाहता था:अनुरोध क्यों हैं। URL.Host और योजना विकास सर्वर में खाली है?

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

लेकिन उनके मूल्यों दोनों खाली कर रहे हैं। क्यूं कर?

उत्तर

45

मूल रूप से, जब से तुम एक HTTP प्रॉक्सी से नहीं HTTP सर्वर तक पहुँच रहे हैं, एक ब्राउज़र एक रिश्तेदार HTTP अनुरोध जारी कर सकते हैं, जैसे इतना:

GET/HTTP/1.1 
Host: localhost:8080 

(यह देखते हुए कि, ज़ाहिर है, सर्वर सुन रहा है लोकलहोस्ट पोर्ट 8080 पर)।

अब, अगर आप तक पहुँचने रहे थे ने कहा कि एक प्रॉक्सी का उपयोग सर्वर, प्रॉक्सी एक निरपेक्ष URL का उपयोग कर सकते हैं:

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

दोनों ही मामलों में, आप क्या जाने के http.Request.URL से प्राप्त किया जाता है कच्चे यूआरएल (के रूप में द्वारा पार्स पुस्तकालय)। यदि आप प्राप्त कर रहे हैं, तो आप एक सापेक्ष पथ से यूआरएल तक पहुंच रहे हैं, इसलिए यूआरएल ऑब्जेक्ट में होस्ट या स्कीम की कमी है।

यदि आप HTTP होस्ट प्राप्त करना चाहते हैं, तो आप http.Request संरचना की Host विशेषता का उपयोग करना चाह सकते हैं। देखें http://golang.org/pkg/http/#Request

आप netcat और उचित रूप से स्वरूपित HTTP अनुरोध का उपयोग करके इसे सत्यापित कर सकते हैं (आप उपरोक्त ब्लॉक की प्रतिलिपि बना सकते हैं, सुनिश्चित करें कि आपकी फ़ाइल में पीछे की रेखा खाली है)। इसे आज़माने के लिए:

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

साथ ही, आपको सर्वर/हैंडलर में जांच कर सकता है कि क्या आप IsAbs() विधि को फोन करके अनुरोध में एक रिश्तेदार या निरपेक्ष URL प्राप्त:

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

दिलचस्प। इतना विस्तृत होने के लिए धन्यवाद। यह थोड़ा अजीब है फिर भी वे dev सर्वर का उपयोग करते समय मौजूद नहीं हैं (मुझे लगता है कि विकास सर्वर अनुरोध भरने के लिए किसी प्रकार का होस्ट वातावरण स्थापित करेगा)। अनुरोध। काम करने के लिए लेकिन यूआरएल का उपयोग करने के लिए .cheme अगर dev सर्वर का उपयोग किया जा रहा है या नहीं तो मुझे सशर्त रूप से जांच करने की आवश्यकता होगी। – moraes

+3

उत्तर के लिए धन्यवाद! क्या आप बता सकते हैं कि इस व्यवहार को कैसे रोकें (यूआरएल पार्सिंग के लिए सिरदर्द)? क्योंकि मुझे अनुरोध ऑब्जेक्ट से भी योजना नहीं मिल सकती है :(क्या यह सामान्य है? –

+0

यह ध्यान देने योग्य है कि कभी-कभी आप इस तरह से बॉट स्पॉट कर सकते हैं (वे पृष्ठ का अनुरोध करते समय पूर्ण यूआरएल का उपयोग करते हैं)। – Xeoncross

संबंधित मुद्दे