为什么我将 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

Why I put the DELETE router after GET, the DELETE endpoint did not get triggered

我正在用 Golang 创建 restful API 并且我按索引将删除路由器放在 getOne 路由器之后,删除路由器从未被触发?我不知道为什么?当我反转它们时,它起作用了! 有人能知道原因吗??

这是为了使用 Golang 构建 Restful API。

无效:

myRouter.HandleFunc("/article", createNewArticle).Methods("POST")

myRouter.HandleFunc("/article/{id}", getOneArticle)

myRouter.HandleFunc("/article/{id}", deleteArticle).Methods("DELETE")

有效!

myRouter.HandleFunc("/article", createNewArticle).Methods("POST")
myRouter.HandleFunc("/article/{id}", deleteArticle).Methods("DELETE")
myRouter.HandleFunc("/article/{id}", getOneArticle)

当我使用带有 DELETE 方法的邮递员测试 api 时,它总是触发 getOneArticle 并响应删除项目,但实际上并没有在数据库中删除!

您正在使用 gorilla/mux。当收到 HTTP 请求时,此路由器会尝试按照您添加它们的顺序匹配路由。

当您添加路由而不指定 HTTP 方法时,它适用于所有 HTTP 方法。

因此,如果与 DELETE 方法匹配的更具体的路由首先出现,那么它将匹配 DELETE 方法调用,下一个路由将匹配所有方法。虽然它也匹配 DELETE,但由于它前面的路由,实际的 DELETE 调用永远不会到达它。

但是如果你反转它们,没有指定HTTP方法的路由将匹配所有方法,包括DELETE。