Какой код ответа нужно вернуть для неподдерживаемого метода HTTP на REST?

Я использую Gorilla Mux для обработки моих HTTP-маршрутов для моего REST API. Я использую следующую привязку для моего 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 tho, так как просьбы не былоOK".

Есть идеи и советы на эту тему?

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

Код статуса, который вы должны вернуть: "405 MethodNotAllowed" или http.StatusMethodNowAllowed в ходу.

Из википедии:

Был сделан запрос ресурса с использованием метода запроса, не поддерживаемого этим ресурсом; например, используя GET в форме, которая требует представления данных через POST, или используя PUT для ресурса, доступного только для чтения.

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

Другие вопросы по тегам