为什么Go http.Client中的POST请求不遵循301重定向?
我正在用Go构建一个测试工具。该工具可以通过对端点执行POST请求来检索特定URL,该端点返回一个303,其中包含要测试的为什么Go http.Client中的POST请求不遵循301重定向?,http,go,Http,Go,我正在用Go构建一个测试工具。该工具可以通过对端点执行POST请求来检索特定URL,该端点返回一个303,其中包含要测试的位置。有时,这个位置本身会被301重定向,我也想遵循301 Test tool -> POST /get-url-to-test -> 303 Location: /other -> GET /other -> 301 Location: /new-other (stops here because initial request is POST)
位置。有时,这个位置本身会被301重定向,我也想遵循301
Test tool -> POST /get-url-to-test -> 303 Location: /other -> GET /other -> 301 Location: /new-other (stops here because initial request is POST)
正如我们在Go的源代码(第241到257行)中所看到的,GET请求似乎遵循301重定向,而不是POST请求:
为什么呢?这是HTTP规范的一部分吗?这是Go社区做出的决定吗
我问这个问题的原因是,在我的例子中,我必须手动执行一个新的GET请求,才能访问由/other
重定向到的URL
编辑1:我之前犯了一个错误:/other
资源正在由Go通过GET请求获取。但由于它返回一个301,并且最初的请求是一个POST,Go会停止在301上重定向。这似乎很奇怪。我错过什么了吗
编辑2:这可能是一个bug,我在Github上打开了一个问题:HTTP说:
10.3重定向3xx
此类状态代码表示用户代理需要采取进一步的操作以满足请求。所需的操作可由用户代理执行
不与用户交互当且仅当
第二个请求是GET或HEAD
有趣。谢谢在进一步研究之后,我在问题中犯了一个错误:/other
资源是通过一个GET
请求通过Go获取的(源代码中的第341行)。所以我认为301也应该遵循,不是吗?这不再是标准行为:RFC2616已经过时,并已被RFC723x取代。看@Rick-777有趣,我必须通过RFC。同时,你能编辑答案并特别指出淘汰2616行为的引语吗?另请参见谢谢@nos。这很有趣。我不知道307的事。然而,这里的问题是Go不会重定向一个到达301的GET请求。这似乎很奇怪。如果您在303上发布帖子,Go会使用GET方法将您重定向到位置
,但如果该位置
本身返回301,则Go会停止重定向,即使我们是通过GET请求到达的。是,这似乎就是代码所做的——当在第302行执行重定向规则时,它会传入POST重定向规则(shouldRedirectPost)函数,该函数对于处理1是有意义的。重新使用但在第一次GET重定向之后,该规则也用于后续GET请求。我不知道这是否是故意的,但听起来像个bug。好的,谢谢你的反馈。我要报告一个错误。