当前位置: 首页 > 面试题库 >

Go Web服务器自动重定向POST请求

姜运珧
2023-03-14
问题内容

我已经尝试解决一个奇怪的问题了一段时间了。在浏览了许多棱角分明的代码之后,当我通过Charles将请求记录到服务器时,我注意到了一些奇怪的东西。

当我发布到url时/myurl,请求实际上不会到达我的服务器。相反,它收到301响应,然后GET请求命中了我的服务器。

这令人难以置信。还有其他人遇到这个问题吗?如果您有兴趣,我已经上传了我的Charles日志的屏幕截图。

在此处输入图片说明

作为参考,这是我的服务器的外观:

type FormStruct struct {
    Test string
}

func PHandler(w http.ResponseWriter, r *http.Request) {
    var t FormStruct

    req, _ := httputil.DumpRequest(r, true)

    log.Println(string(req))
    log.Println(r.Method) // GET
    log.Println(r.Body)

    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&t)
    log.Println("Decoding complete")
    if err != nil {
        log.Println("Error")
        panic(err.Error()+"\n\n")
    }
    log.Println(t.Test)

    w.Write([]byte("Upload complete, no errors"))
}

func main() {
    http.HandleFunc("/myurl/", PHandler)    
    fmt.Println("Go Server listening on port 8001")
    http.ListenAndServe(":8001", nil)
}

问题答案:

解释很简单:因为"/myurl/"注册时使用了路径PHandler(请注意末尾有斜杠/!),但您却将浏览器定向到了/myurl(请注意没有后缀正斜杠)。默认情况下,http程序包实现将执行(发送回)重定向请求,因此,如果浏览器遵循该重定向请求(它将执行),则新URL将匹配注册的路径。

记录在类型http.ServeMux

如果已经注册了一个子树,并且接收到一个命名该子树根的请求而没有其后斜杠,则ServeMux将该请求重定向到该子树根(添加后斜杠)。
可以用单独的路径注册来覆盖此行为,而不必使用斜杠。例如,注册“ / images /”会使ServeMux将对“ / images”的请求重定向到“ /
images /”,除非已单独注册了“ / images”。

如果您将浏览器直接/myurl/定向到,则不会遇到重定向。

或者,如果您不需要处理有根的子树,而只需要处理一个路径(例如/myurl),则仅将处理程序注册到该路径:

http.HandleFunc("/myurl", PHandler)

然后,当然将您的浏览器/myurl定向到,也不会遇到任何重定向。

…或者如文档所示:如果确实需要,请注册到处理程序的两个路径:

http.HandleFunc("/myurl", PHandler)
http.HandleFunc("/myurl/", PHandler)

现在,无论您调用(/myurl/myurl/)哪个路径,两者都将导致调用处理程序而不会发生任何重定向。

笔记

在您将重定向发送回浏览器的情况下,浏览器将不会重复POST请求(而只会重复“简单” GET请求)。

一般而言,浏览器不会将POST数据发送到重定向URL,因为该浏览器没有资格决定您是否愿意将要发送的数据发送到新URL(打算将其发送到原始URL)(请考虑密码,信用卡号和其他敏感数据)。但不要试图绕过它,只需使用处理程序的注册路径(POST到)或上述任何其他技巧即可。



 类似资料:
  • 我有这个代码: 当为 true(执行 POST 或 PUT 请求)时,此代码会引发 IOException,并且不会完成请求。我尝试对 重新排序、编写调用和流创建块,但没有排列工作。 在所有情况下,BufferedReader都工作得很好,不会抛出任何异常。< code>getQuery正确返回URL编码的字符串。 以下是来自IOExc的堆栈跟踪: 最终发生的是请求通过,但没有一个POST或PUT

  • 环境Centos与apache 正在尝试设置从http到https的自动重定向 我试图添加以下内容到我的httpd.conf但它不工作 有什么想法吗?

  • 我有一个网页,这是一个邮政路线。这个页面有一个删除按钮,可以路由到另一个POST路由,在这里我删除指定的数据库行并重定向回第一个页面。 问题是,当我使用任何back()或reway()函数时,它们似乎会产生对上一个URL的GET请求。但上一页是仅限POST页。 如何将POST请求和POST数据重定向回?

  • 问题内容: 我正在尝试允许javascript与Node.js服务器通信。 POST请求(Web浏览器) 现在,Node.js服务器代码如下所示。在用于GET请求之前。我不确定如何使其与POST请求一起使用。 服务器(Node.js) 在此先感谢您的帮助。 问题答案: 以下代码显示了如何从HTML表单读取值。正如@pimvdb所说,您需要使用request.on(’data’…)来捕获正文的内容。

  • 我最近一直在用Java编写自己的Webserver,因为我觉得有一个很不错,昨天我偶然发现了一个问题,我仍然没有解决。我的浏览器(取消搜索Chromium)似乎向服务器发送了一些空请求或类似的东西。我实现了一个请求处理程序,它应该读取GET请求并提取请求的资源。它的工作原理是这样的:它以请求为例:“GET/index.htmlHTTP/1.1”并将其放入带有String.split (" ");

  • 我试图点击一个postendpoint,但它给出了错误302,当我在同一台服务器上尝试另一个get Url时,它给出了200。然后,我使用laxrirectstrategy()重定向了post请求。post请求正在重定向到get请求(只有同一个endpoint的方法名是get和post),它没有从post方法获得响应。有人能告诉我如何使用apahce httpClient 4.5将post请求重定