0

我正在使用 Gorilla Mux 来处理我的 REST API 的 HTTP 路由。我正在为我的 API 使用以下绑定:

r := mux.NewRouter()
r.Host(baseUrl)

api := r.PathPrefix("/api").Subrouter()
api.HandleFunc("/users", APIUsers).Methods("GET", "POST")

http.Handle("/", r)
http.ListenAndServe(":8083", nil)

然后我做一个这样的CURL:

$ curl -i -X PUT http://127.0.0.1:8083/api/users

正如预期的那样,该方法APIUsers没有被调用。我确实得到了200 OK回报:

HTTP/1.1 200 OK
Date: Tue, 30 Dec 2014 19:03:59 GMT
Content-Length: 0
Content-Type: text/plain; charset=utf-8

我是否应该对 Gorilla 进行不同的操作,例如将所有失败的功能绑定到指定的功能?另外我想知道在不受支持的函数上返回的典型 HTTP 代码是什么。我假设该400范围内的代码,但我不确定使用哪个。我不希望这样200,因为请求不是“ OK”。

关于这个主题的任何想法和提示?

4

2 回答 2

2

您应该返回的状态代码是“405 MethodNotAllowed”或http.StatusMethodNowAllowed正在运行。

来自维基百科:

使用该资源不支持的请求方法对该资源发出请求;例如,在需要通过 POST 呈现数据的表单上使用 GET,或者在只读资源上使用 PUT。

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

于 2014-12-30T19:17:10.950 回答
2

您可以设置自定义NotFoundHandler,但这将适用于所有不匹配的路线。

如果要返回特定响应,则必须明确定义路由。

例子:

func main() {
    r := mux.NewRouter().PathPrefix("/api").Subrouter()

    // custom not found handler used for unmatched routes
    var notFound NotFound
    r.NotFoundHandler = notFound

    r.HandleFunc("/users", APIUsers).Methods("GET", "POST")

    // return 405 for PUT, PATCH and DELETE
    r.HandleFunc("/users", status(405, "GET", "POST")).Methods("PUT", "PATCH", "DELETE")

    http.Handle("/", r)

    http.ListenAndServe(":8083", nil)
}

type NotFound func(w http.ResponseWriter, req *http.Request)

func (NotFound) ServeHTTP(w http.ResponseWriter, req *http.Request) {
    w.WriteHeader(404)
    w.Write([]byte(`{"message": "Not Found"}`))
}

// status is used to set a specific status code
func status(code int, allow ...string) func(w http.ResponseWriter, req *http.Request) {
    return func(w http.ResponseWriter, req *http.Request) {
        w.WriteHeader(code)
        if len(allow) > 0 {
            w.Write([]byte(`Allow: ` + strings.Join(allow, ", ")))
        }
    }
}

func APIUsers(w http.ResponseWriter, req *http.Request) {
    w.Write([]byte("hello"))
}
于 2014-12-30T22:41:39.543 回答