为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
FFIVE 2021-09-10 16:29:11
我正在使用 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/usersAPIUsers正如预期的那样,该方法没有被调用。我确实得到了200 OK回复:HTTP/1.1 200 OKDate: Tue, 30 Dec 2014 19:03:59 GMTContent-Length: 0Content-Type: text/plain; charset=utf-8我是否应该与 Gorilla 做不同的事情,让我们说,将所有失败的功能绑定到指定的功能?我也想知道在不支持的函数上返回的典型 HTTP 代码是什么。我假设该400范围内有一个代码,但我不确定要使用哪个。我不希望它是200tho,因为请求不是“ OK”。关于这个主题的任何想法和提示?
查看完整描述

2 回答

?
慕运维8079593

TA贡献1876条经验 获得超5个赞

您应该返回的状态代码是“405 MethodNotAllowed”或http.StatusMethodNowAllowedin go。

来自维基百科:

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

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


查看完整回答
反对 回复 2021-09-10
?
弑天下

TA贡献1818条经验 获得超8个赞

您可以设置自定义,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"))

}



查看完整回答
反对 回复 2021-09-10
  • 2 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信