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

カスタムを設定できます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 に答える