为什么我在GET之后放置DELETE路由器,但未触发DELETE端点

时间:2019-05-20 20:32:08

标签: go gorilla

我正在使用Golang创建宁静的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并使用删除项进行响应,但实际上并没有在数据库中删除!

1 个答案:

答案 0 :(得分:3)

您正在使用大猩猩/多路复用器。当HTTP请求进入时,此路由器将尝试按照添加路由的顺序匹配路由。

在未指定HTTP方法的情况下添加路由时,该路由将应用于所有HTTP方法。

因此,如果首先出现与DELETE方法匹配的更具体的路由,则它将与DELETE方法调用匹配,而下一条路由将与所有方法匹配。尽管它也与DELETE匹配,但是由于它前面的路由,实际的DELETE调用永远不会到达它。

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