2015-07-12 18 views
5

Tôi đang chạy trên HTTPS (cảng 10.443) và sử dụng subroutes:mux.Vars không làm việc

mainRoute := mux.NewRouter() 
mainRoute.StrictSlash(true) 
mainRoute.Handle("/", http.RedirectHandler("/static/", 302)) 
mainRoute.PathPrefix("/static/").Handler(http.StripPrefix("/static", *fh)) 

// Bind API Routes 
apiRoute := mainRoute.PathPrefix("/api").Subrouter() 

apiProductRoute := apiRoute.PathPrefix("/products").Subrouter() 
apiProductRoute.Handle("/", handler(listProducts)).Methods("GET") 

Và các chức năng:

func listProducts(w http.ResponseWriter, r *http.Request) (interface{}, *handleHTTPError) { 
    vars := mux.Vars(r) 

    productType, ok := vars["id"] 
    log.Println(productType) 
    log.Println(ok) 
} 

okfalse và tôi không có ý tưởng tại sao. Tôi đang thực hiện một đơn giản ?type=model sau URL của mình ..

Trả lời

19

Khi bạn nhập URL như somedomain.com/products?type=model, bạn chỉ định chuỗi truy vấn chứ không phải biến.

Chuỗi truy vấn trong Go được truy cập qua r.URL.Query - ví dụ:

vals := r.URL.Query() // Returns a url.Values, which is a map[string][]string 
productTypes, ok := vals["type"] // Note type, not ID. ID wasn't specified anywhere. 
var pt string 
if ok { 
    if len(productTypes) >= 1 { 
     pt = productTypes[0] // The first `?type=model` 
    } 
} 

Như bạn có thể thấy, đây có thể là một chút phiền phức vì nó có vào tài khoản cho giá trị bản đồ là trống rỗng và cho khả năng của một URL như somedomain.com/products?type=model&this=that&here=there&type=cat nơi một chìa khóa có thể được xác định nhiều hơn một lần.

Như per the gorilla/mux docs bạn có thể sử dụng các biến tuyến đường:

// List all products, or the latest 
    apiProductRoute.Handle("/", handler(listProducts)).Methods("GET") 
    // List a specific product 
    apiProductRoute.Handle("/{id}/", handler(showProduct)).Methods("GET") 

Đây là nơi bạn sẽ sử dụng mux.Vars:

vars := mux.Vars(request) 
id := vars["id"] 

Hy vọng rằng sẽ giúp làm rõ. Tôi muốn giới thiệu phương pháp tiếp cận biến trừ khi bạn cần sử dụng chuỗi truy vấn cụ thể.

+0

Tất nhiên haha, tệ của tôi. Làm cho cảm giác bây giờ^_^ –

+0

Điều gì về các tham số truy vấn? @elithrar – kamal

+1

@kamal "Chuỗi truy vấn trong phần Truy cập được truy cập qua r.URL.Query" – elithrar

0

Một cách dễ dàng hơn để giải quyết việc này là thêm tham số truy vấn trong lộ trình của bạn thông qua Queries, như:

apiProductRoute.Handle("/", handler(listProducts)). 
       Queries("type","{type}").Methods("GET") 

Bạn có thể lấy nó bằng cách sử:

v := mux.Vars(r) 
type := v["type"] 

Chú ý: Đây có thể không có được có thể khi câu hỏi ban đầu được đăng nhưng tôi tình cờ gặp phải vấn đề này khi tôi gặp phải vấn đề tương tự và tài liệu gorilla đã giúp.