我想在一个条件中替换Location标头。我使用以下命令启用重定向
client.prepareGet(request.getUrl())
.setFollowRedirect(true)
我所做的是扩展AsyncCompletionHandler类,从那里我@Override onHeadersReceived(),
@Override
public State onHeadersReceived(final HttpResponseHeaders headers) throws Exception {
String location = headers.getHeaders().get("Location").replace("itmss", "https"
);
DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
httpHeaders.add(HEADER, location);
httpHeaders.add(headers.getHeaders());
return inner.onHeadersReceived(new HttpResponseHeaders(httpHeaders));
}
但是,我发现请求仍然使用itms
而不是https
,这意味着不会替换位置标头。
目前的计划是实现在Redirect30xInterceptor.java
(https://github.com/AsyncHttpClient/async-http-client/blob/dd459294434a408cff3c65c9f5c402b82d60aaa2/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java)之前运行的拦截器,并更改网址。
另一个计划是为以下代码执行while循环,每当接收3XX时,在下一个请求中设置一个新url。
client.prepareGet(request.getUrl())
.addHeader("User-Agent", request.getUserAgent())
.setProxyServer(proxyServer)
.execute(new ResponseAsyncCompletionHandler(request))
.toCompletableFuture();
最终目标是将itms://
替换为https://
,因此下一个请求使用https
代替itms
。
答案 0 :(得分:0)
经过深入研究,okhttp很容易支持拦截器。
如果想使用AsyncHttp,那就更棘手了。您必须实现ResposeFilter,然后从那里更改请求,并设置replayRequest(true),这意味着发出了新请求。
示例代码
builder.request(new RequestBuilder(nextRequest).build()).replayRequest(true);