为啥我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发

Posted

技术标签:

【中文标题】为啥我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发【英文标题】:Why I put the DELETE router after GET, the DELETE endpoint did not get triggered为什么我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发 【发布时间】:2019-05-20 20:32:08 【问题描述】:

我正在使用 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)

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

【问题讨论】:

想想这是如何执行的......DELETE /article/id匹配myRouter.HandleFunc("/article/id", getOneArticle)所以程序不会继续下一条路线 但是我把DELETE放在什么前面,下面的getOneArticle还是可以的, 所以DELETE请求匹配GET操作??? 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于为啥我把 DELETE 路由器放在 GET 之后,DELETE 端点没有被触发的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C++ 函数只有放在 main() 之后才起作用?

为啥python 3在while循环之后禁止if-condition? [关闭]

为啥我把GHOST镜像放在D盘,进入GHOST确把D盘认成C盘!

laravel向我显示此错误此路由不支持POST方法。支持的方法:GET,HEAD,PUT,DELETE

tp6-路由

安卓手机在更新软件之后,有一个软件有两个图标。我把那两个图标放在一起,之后卸载了那个软件,软件的两