繁体   English   中英

无法使用 Gin/GoLang 将 POST 请求更改为 GET 请求

[英]Can't change POST request to GET request using Gin/GoLang

我似乎无法在 Gin Framework 中使用 GET 方法更改 POST 方法。 当我收到请求时,我想检查它的凭据,如果有效,则重定向到另一个具有 GET 端点的页面。 每当我使用c.Request.Method="GET"时,它似乎只更改当前端点的请求,但重定向的请求仍然具有原始方法,即 POST 方法。

代码:

auth.GET("/sign-in", func(c *gin.Context) {
    c.File("../../html/index.html")
})

auth.POST("/sign-in", func(c *gin.Context) {
    c.Request.Method = "GET"
    c.Redirect(http.StatusTemporaryRedirect, "/profile/:pid")
})

请求日志

Code 307请求本来是POST请求,端点自己改成了GET

执行c.Request.Method="GET"没有帮助。 也找不到答案。 知道如何改变这种行为吗? 创建新请求是唯一的解决方案吗?

307 状态代码文档说:

重新使用原始请求的方法和主体来执行重定向的请求。 在您希望使用的方法更改为 GET 的情况下,请改用 303 See Other。

因此,如果您将http.StatusTemporaryRedirect更改为http.StatusSeeOther ,它将在不更改原始请求方法的情况下工作。

您是正确的,在POST端点中设置c.Request.Method = "GET"只会更改该端点的方法,并且在重定向中发送的请求的方法仍然是POST

实现所需行为的正确方法是使用c.Request.Method来设置方法,而不是使用特定于当前请求的Redirect ,您应该使用c.HTML重定向,它发出新请求并呈现您想要的新端点使用您设置的正确方法访问。

您提到的http.StatusSeeOther状态代码也是在这种情况下使用的正确代码,因为它表示资源已被临时移动,客户端应使用 Location header 字段中提供的新 URI 来访问资源。

所以你的代码可能是这样的:

auth.POST("/sign-in", func(c *gin.Context) {
    c.Request.Method = "GET"
    c.HTML(http.StatusSeeOther, "profile/:pid", nil)
})

通过这种方式,您将重定向到新位置,但会使用您想要的方法进行新请求。

Go 按程序读取端点,因此如果它遇到 GET 请求,它不会为同一端点搜索另一个 GET 请求。 最“最高”的获胜。 AFAIK,我在这里可能是错的。 但...

如果您将逻辑更改为以下内容怎么办?

 auth.POST("/sign-in", func(c *gin.Context) { c.Request.Method = "GET" // Serve the index -page // Implement the credential check logic here // Perform validation... isValidUser, _:= checkCredentials(user.Username, user.Password) if isValidUser { c.Redirect(http.StatusTemporaryRedirect, "/profile/:pid") }... })

按照这个逻辑,从这里继续——同时完全放弃第一个 GET 请求。

注意:这不是有效的代码,只是您可以如何继续的想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM