使用.setFollowRedirect(true)和aysnchttpclient

时间:2018-01-17 16:32:24

标签: java asynchttpclient

我想在一个条件中替换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.javahttps://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

1 个答案:

答案 0 :(得分:0)

经过深入研究,okhttp很容易支持拦截器。

如果想使用AsyncHttp,那就更棘手了。您必须实现ResposeFilter,然后从那里更改请求,并设置replayRequest(true),这意味着发出了新请求。

示例代码

builder.request(new RequestBuilder(nextRequest).build()).replayRequest(true);

https://github.com/AsyncHttpClient/async-http-client/blob/master/client/src/main/java/org/asynchttpclient/netty/handler/intercept/ResponseFiltersInterceptor.java#L62