在 REST 上不支持的 HTTP 方法上返回什么响应代码?

我正在使用 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 -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范围内有一个代码,但我不确定要使用哪个。我不希望它是200tho,因为请求不是“ OK”。


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


FFIVE
浏览 151回答 2
2回答

慕运维8079593

您应该返回的状态代码是“405 MethodNotAllowed”或http.StatusMethodNowAllowedin go。来自维基百科:使用资源不支持的请求方法对资源发出请求;例如,在需要通过 POST 呈现数据的表单上使用 GET,或在只读资源上使用 PUT。http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

弑天下

您可以设置自定义,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 codefunc 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"))}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go