2016-11-27 5 views
2

В Ruby/Rack я могу get the scheme of the current request URL from scheme#request. Однако, в Go, http.Request.URL.Scheme возвращает пустую строку:Получить схему текущего запроса URL

package main 

import (
    "fmt" 
    "log" 
    "net/http" 
) 

func main() { 
    http.HandleFunc("/", handler) 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "%#v\n", r.URL.Scheme) // Always shows empty string 
} 

Как получить схему текущего URL запроса?

+0

вы можете инспектировать 'r.Proto' он будет возвращать HTTP/1.1 или HTTP/2 в соответствии с документацией, но не уверен, если это изменится HTTPS –

ответ

-1

Это потому, что вы обращаетесь к серверу HTTP так:

GET/HTTP/1.1 
Host: localhost:8080 

в этом случае, основываясь на анализе того, что вы получаете сырье URL от Гоу http.Request.URL. почему вы получаете это, потому что вы получаете доступ к URL-адресу из относительного пути, а следовательно, к отсутствию хоста или схемы в объекте URL.

Если вы хотите получить хост HTTP, вам может потребоваться доступ к атрибуту Host структуры http.Request. См http://golang.org/pkg/http/#Request

как это не напрямую, но вы все равно можете быть в состоянии собрать его:

u := r.URL 

// The scheme can be http/https because that's depends on protocol your server handles. 
u.Scheme = "http" 
+0

http://stackoverflow.com/ questions/6899069/why-are-request-url-host-and-scheme-blank-in-the-development-server Просто скопирован из более старого ответа. – I159

2

локальный особый случай для URL формирования. В любом случае, он будет пустым, если ваш клиент является localhost.

net.http package doc:

В особом случае, если req.URL.Host является «локальным» (с или без номера порта), то будет возвращена нилью URL-адрес и ноль ошибка.

Способ получения информации о url/uri - получить ее непосредственно от http.Request. Например:

func handler(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprintf(w, "%s\n", r.Host)      
}              
Смежные вопросы