如何在Apache HttpClient 5.1中跟随POST重定向

5

我正在寻找如何在Apache HttpClient 5.1中跟随POST请求的重定向。

默认情况下,只有导致重定向的GET请求会自动跟随。如果POST请求被回答为HTTP 301(永久移动)或302(暂时移动) - 重定向不会自动跟随。这是由HTTP RFC 2616指定的。

然而,在某些情况下,必须将POST请求重定向为POST。在这种情况下,必须更改默认行为以放宽严格的HTTP规范。

使用Apache HttpClient 4.5,可以通过将DefaultRedirectStrategy替换为LaxRedirectStrategy或自定义实现RedirectStrategy接口来轻松实现此操作。示例:

在Apache HttpClient 5.1中,这不再起作用了。 RedirectStrategy接口已更改,不再包含getRedirect方法,LaxRedirectStrategy实现也已被删除。
是否有一种类似或简单的方法可以覆盖默认的POST重定向行为,在Apache HttpClient 5.1中与HttpClient 4.5类似?

1
你碰巧找到了答案吗?我现在也面临着同样的问题。 - Melvin Sy
嗨@MelvinSy,感谢您对这个问题的关注。我已经将我的回复发布为答案,希望您会觉得有用。 - curd0
1个回答

5
由于迄今为止没有人回复,我将发布自己的发现作为答案。
我们公司的一个内部服务器处理文件上传,必须从HTTP转换为HTTPS。另外的要求是:如果有人忘记更新他们的URL并使用HTTP上传文件,则必须正确重定向他们的上传到HTTPS并进行处理。
使用HttpClient 4.5(参见原始问题)很容易做到这一点,但使用HttpClient 5.1则不同。如果客户端通过HTTP发送POST请求到HTTPS服务器,则会被重定向(301永久移动),POST会被转换为GET,然后被服务器拒绝。
检查源代码后,我发现在版本5.1中,HttpClient开发人员决定严格执行HTTP RFC 2616,并删除了覆盖或放宽重定向策略的可能性。
在HttpClient 5.1.x中,请求重定向由RedirectExec类处理,其中将替换某些状态码(302、302、303)的POSTGET的逻辑是硬编码的。

enter image description here

这使得客户端解决方案变得相当繁琐和昂贵。然而,由于我对服务器拥有完全控制权,我决定在服务器端解决问题。
通过重新配置NGNIX服务器,在HTTP到HTTPS重定向时返回“308永久重定向”,而不是默认的“301永久移动”,从而解决了这个问题。
server {
    listen 80      default_server;
    listen [::]:80 default_server;
    server_name _;
    return 308 https://$host$request_uri;
}

不完全是我所希望的解决方案,但非常适合我的使用情况,而且比编写RedirectExec的自定义实现要简单得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接