我正在使用 Apache HttpComponents(核心 - 4.1.3,httpclient 4.1.1)在我编写的 REST 客户端中发出 http 请求。 Web 服务需要 OAuth,我已经使用 signpost 实现了它。最近,Web 服务引入了 301 重定向到也需要 oauth 的端点。所以,我已经实现了一个自定义的 RedirectStrategy,它构建一个新的请求并用路标对其进行签名,就像我通常做的那样。但是,在我返回新请求后的前两行(在 DefaultRequestDirector 中)立即将所有 header 设置为初始请求中发送的 header ,有效地删除我的新授权 header 并导致所有重定向请求失败。
有人知道解决这个问题的方法吗?我考虑过总是在我的习惯中返回 false RedirectStrategy并将其交给 ResponseHandler我已经附加到我的请求中,但是没有简单的方法来重建请求并通过适当的客户端将其提交回来。
这些是 DefaultRequestDirector 中的第 1021-1023 行,它调用我的自定义 RedirectStrategy 然后删除我的标题(我将尝试链接到源,很快):
HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context);
HttpRequest orig = request.getOriginal();
redirect.setHeaders(orig.getAllHeaders());
最佳答案
我在这里有点猜测,但如果您所指的代码是行 349 of DefaultRequestDirector
,然后在第 452 行的更下方调用了 requestExec.preProcess(wrapper, httpProcessor, context)
。
是否可以在这里注册一个签署请求的处理器?
如果没有,BasicHttpProcessor
(这可能是这里使用的处理器)允许您注册允许您参与请求预处理的拦截器。
这可能是签署请求的另一种选择。
或者,有一个 HttpContext
目的。该对象的 Javadoc 建议它可用于保存请求的上下文数据,并且您的数据符合此描述。所以把它停在那里,以后需要时再取。
关于java - 使用 Apache HttpComponents 在重定向时覆盖 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420980/