7

HTTPS (ポート 10443) で実行しており、サブルートを使用しています。

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

そして機能:

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あり、その理由がわかりません。URLの後に簡単なことをしてい?type=modelます..

4

2 に答える 2

33

somedomain.com/products?type=model変数ではなく、クエリ文字列を指定しているように URL を入力すると。

r.URL.QueryGo のクエリ文字列には、次の方法でアクセスできます。

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

ご覧のとおり、マップ値が空であるsomedomain.com/products?type=model&this=that&here=there&type=catことと、キーを複数回指定できる URL の可能性を考慮しなければならないため、これは少し扱いに​​くい場合があります。

gorilla /mux docs に従って、ルート変数を使用できます。

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

これはあなたが使用する場所ですmux.Vars

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

明確にするのに役立つことを願っています。特にクエリ文字列を使用する必要がない限り、変数アプローチをお勧めします。

于 2015-07-12T21:10:30.103 に答える