【问题标题】:Golang gorilla mux REST api is giving 405 error on using PUT and DELETE methodsGolang gorilla mux REST api 在使用 PUT 和 DELETE 方法时出现 405 错误
【发布时间】:2020-09-04 09:07:00
【问题描述】:

Golang gorilla mux REST api 在使用 PUT 和 DELETE 方法时出现 405 错误。但是 GET 和 POST 方法工作正常。

我使用 postman 测试我的 REST api 服务器,GET 和 POST 请求工作正常,但 PUT 和 DELETE 方法不起作用并给出 错误 405

...
...
func updateBook(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(r)
    for index, item := range books {
        if item.ID == params["id"]{
            books = append(books[:index], books[index+1:]...)
            var book Book
            _ = json.NewDecoder(r.Body).Decode(&book)
            book.ID = params["id"]
            books = append(books, book)
            json.NewEncoder(w).Encode(books)
            return
        }
    }
}

func deleteBook(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(r)
    for index, item := range books {
        if item.ID == params["id"]{
            books = append(books[:index], books[index+1:]...)
            break
        }
    }
    json.NewEncoder(w).Encode(books)
}



func main() {
    // INIT router
    r := mux.NewRouter()

    // Mock data
    books = append(books, Book{
    ID: "1",
    Isbn: "43432",
    Title: "Book first",
    Author: &Author{
        FirstName: "Vishal",
        LastName: "Sharma",
    },
    })

    // Route handlers / Endpoints
    r.HandleFunc("/api/books", getbooks).Methods("GET")
    r.HandleFunc("/api/books/{id}", getBook).Methods("GET")
    r.HandleFunc("/api/books", createBook).Methods("POST")
    r.HandleFunc("api/books/{id}", updateBook).Methods("PUT")
    r.HandleFunc("api/books/{id}", deleteBook).Methods("DELETE")

    log.Fatal(http.ListenAndServe(":3000", r))
}

【问题讨论】:

  • go 版本是 1.14
  • 这两种方法的端点模式字符串中是否缺少前导斜杠?如果这确实是问题的原因,请随时关闭/删除问题,因为问题是由拼写错误引起的。
  • 谢谢@mkopriva,这是错字。现在它工作正常。

标签: rest go mux


【解决方案1】:

正如 cmets 中指出的那样,这是一个错字。

r.HandleFunc("api/books/{1}", deleteBook).Methods("DELETE")

我在 api/books/{1}

之前缺少 / 正斜杠

正确的语法是

r.HandleFunc("/api/books/{1}", deleteBook).Methods("DELETE")

【讨论】:

    猜你喜欢
    • 2017-09-18
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2015-11-07
    • 2013-04-01
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多