我正在使用Apache HttpComponents(核心 - 4.1.3,httpclient 4.1.1)在我编写的REST客户端中发出http请求。 Web服务需要OAuth,我已使用路标实现。最近,Web服务已经向端点引入了301重定向,这些端点也需要oauth。所以,我已经实现了一个自定义的RedirectStrategy,它可以构建一个新的请求并使用路标进行签名,就像我正常做的那样。但是,在我返回新请求后的前两行(在DefaultRequestDirector中)将所有标头设置为初始请求中发送的标头,有效地擦除了我的新Authorization标头并导致所有重定向请求失败。
有没有人知道解决这个问题的方法?我已经考虑过总是在我的自定义RedirectStrategy中返回false并将其放在我已经附加到我的请求的ResponseHandler中,但是没有简单的方法来重构请求并通过正确的方式将其提交回来客户端。
这些是DefaultRequestDirector中的第1021-1023行,它调用我的自定义RedirectStrategy然后擦除我的标题(我会尽快链接到源代码):
HttpUriRequest redirect = redirectStrategy.getRedirect(request, response, context);
HttpRequest orig = request.getOriginal();
redirect.setHeaders(orig.getAllHeaders());
答案 0 :(得分:2)
我在这里猜测一下,但是如果您所指的代码是行349 of DefaultRequestDirector
,那么在第452行进一步向下调用requestExec.preProcess(wrapper, httpProcessor, context)
。
是否可以在此注册签署请求的处理器?
如果没有,BasicHttpProcessor
(可能是此处使用的处理器)允许您注册允许您参与请求预处理的拦截器。
这可能是签署请求的另一种选择。
或者,有一个HttpContext
对象。此对象的Javadoc表明它可用于保存请求的上下文数据,您的数据将适合此描述。所以把它停在那里,然后在你需要的时候重新开始。