1

以下のように、2 つの URL を 1 つの関数にバインドします。

router.HandleFunc("/_Users", controller.AddResource)
router.HandleFunc("/Resources/{resourceName}", controller.AddResource)

「controller.AddResource」はグローバル関数です。以下のようなコード:

function AddResource(req *http.Request, w http.ResponseWriter){
    vars := mux.Vars(req)
    resourceName := vars["resourceName"]
    data = request.Body
    AddDataToResource(resourceName, data)
}

では、最初のルーターでvars(resourceName='_User')を設定するにはどうすればよいですか?

4

1 に答える 1

2

mux var を設定するハンドラ ラッパーを作成します。

type setVarWrapper struct {
    fn func(http.ResponseWriter, *http.Request)
    name string
    value string
}

func (h *setVarWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
   mux.Vars(req)[h.name] = h.value
   h.fn(w, r)
}

ユーザー コントローラーをラップします。

router.Handle("/_Users, &setVarWrapper{fn:controller.AddResource, name:"resourceName", value:"_User"})

より簡単なオプションは、汎用コントローラーを呼び出す AddUser 関数を作成することです。

function addUser(req *http.Request, w http.ResponseWriter){
    mux.Vars(req)["resourceName"] = "_User"
    controller.AddResource(w, req)
}

router.HandleFunc("/_Users", addUser)

おそらくもっと簡単なのは、ハンドラで "" をチェックすることです:

function AddResource(req *http.Request, w http.ResponseWriter){
    vars := mux.Vars(req)
    resourceName := vars["resourceName"]
    if resourceName == "" {
       resourceName = "_User"
    }
    data = request.Body
    AddDataToResource(resourceName, data)
}
于 2014-12-22T07:34:30.523 に答える