2014-04-18 4 views
8

HTTP 서버를 만들었습니다. 요청 URL을 얻기 위해 아래 코드를 사용하고 있지만 전체 URL을 얻지는 못합니다.http.Request에서 URL을 얻는 방법

func Handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Printf("Req: %s %s", r.URL.Host, r.URL.Path) 
} 

나는 단지 "Req:/""Req: /favicon.ico"입니다.

전체 클라이언트 요청 URL을 "1.2.3.4/" 또는 "1.2.3.4/favicon.ico"으로 지정하고 싶습니다.

감사합니다.

답변

14

에서와 같이 역 (AN URL에서 추출 호스트를) 참조하십시오의

type Request struct { 
    ... 
    // The host on which the URL is sought. 
    // Per RFC 2616, this is either the value of the Host: header 
    // or the host name given in the URL itself. 
    // It may be of the form "host:port". 
    Host string 
    ... 
} 

수정 된 버전 당신의 코드 :

func Handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Printf("Req: %s %s\n", r.Host, r.URL.Path) 
} 

E xample 출력 :

Req: localhost:8888/
3

상대 URL (r.URL.IsAbs() == false)을 처리하는 것으로 확인되면 Host 그 자체 인 r.Host (see http.Request)에 액세스 할 수 있습니다.

둘을 연결하면 전체 URL이 제공됩니다.

일반적으로, 당신은 그물/HTTP 패키지의 문서에서 gorilla/reverse/matchers.go

// getHost tries its best to return the request host. 
func getHost(r *http.Request) string { 
    if r.URL.IsAbs() { 
     host := r.Host 
     // Slice off any port information. 
     if i := strings.Index(host, ":"); i != -1 { 
      host = host[:i] 
     } 
     return host 
    } 
    return r.URL.Host 
} 
+0

! 나는 상대 URL을 가지고 있고 당신의 가이드에 따라, 나는 지금 호스트를 얻을 수있다. 그러나 나는 또한 계획을 필요로한다, 당신은 그것을 얻는 방법을 알고 있냐? – nullgraph

+0

@nullgraph 확실치 않은 질문 : 독자적으로 질문을 할 수 있습니다. – VonC

1

내가 req.URL.RequestURI()를 사용하는 전체 URL을 얻을 수 있습니다. net/http/requests.go에서

: 내가 상대 URL, 풍어와 수표를 볼 때까지 나는이 당황했다

// RequestURI is the unmodified Request-URI of the 
// Request-Line (RFC 2616, Section 5.1) as sent by the client 
// to a server. Usually the URL field should be used instead. 
// It is an error to set this field in an HTTP client request. 
RequestURI string