2011-08-01 19 views
30

Tôi mới đến Go. Đã thử số hello, world đầu tiên này từ tài liệu và muốn đọc Máy chủ và sơ đồ từ yêu cầu:Tại sao yêu cầu.URL.Hàng và Đề án trống trong máy chủ phát triển?

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

Nhưng giá trị của chúng đều trống. Tại sao?

Trả lời

45

Về cơ bản, vì bạn đang truy cập vào máy chủ HTTP không phải từ một proxy HTTP, một trình duyệt có thể phát hành một yêu cầu HTTP tương đối, như vậy:

GET/HTTP/1.1 
Host: localhost:8080 

(Cho rằng, tất nhiên, máy chủ đang lắng nghe trên cổng localhost 8080).

Bây giờ, nếu bạn đang truy cập vào nói máy chủ sử dụng một proxy, proxy có thể sử dụng một URL tuyệt đối:

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

Trong cả hai trường hợp, những gì bạn nhận được từ Go http.Request.URL được URL thô (như phân tích của thư viện). Trong trường hợp bạn đang nhận được, bạn đang truy cập URL từ một đường dẫn tương đối, do đó thiếu một Host hoặc Scheme trong đối tượng URL.

Nếu bạn muốn nhận máy chủ HTTP, bạn có thể muốn truy cập thuộc tính Host của cấu trúc http.Request. Xem http://golang.org/pkg/http/#Request

Bạn có thể xác thực bằng cách sử dụng netcat và yêu cầu HTTP được định dạng phù hợp (bạn có thể sao chép các khối ở trên, đảm bảo có dòng trống sau trong tệp của bạn). Để thử nó ra:

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

Ngoài ra, bạn có thể kiểm tra trong máy chủ/handler cho dù bạn có được một URL tương đối hoặc tuyệt đối trong yêu cầu bằng cách gọi phương pháp IsAbs():

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

Thú vị. Cảm ơn bạn đã quá chi tiết. Đó là một chút lạ tuy nhiên rằng những người không có mặt trong khi sử dụng máy chủ dev (tôi đoán rằng các máy chủ phát triển sẽ thiết lập một số loại môi trường máy chủ để điền vào yêu cầu). request.Host đã làm việc nhưng để sử dụng URL.Scheme tôi sẽ cần phải kiểm tra có điều kiện nếu máy chủ dev đang được sử dụng hay không. – moraes

+3

Cảm ơn bạn đã trả lời! Bạn có thể cho biết cách ngăn chặn hành vi này (nhức đầu để phân tích cú pháp URL) không? Bởi vì tôi thậm chí không thể có được kế hoạch từ đối tượng Yêu cầu: (Điều này có bình thường không? –

+0

Điều đáng chú ý là đôi khi bạn có thể phát hiện bot theo cách này (họ sử dụng URL đầy đủ khi yêu cầu một trang) – Xeoncross