使用 aysnchttpclient 时使用 .setFollowRedirect(true) 替换 Location header

replace Location header when using .setFollowRedirect(true) with aysnchttpclient

我想在一种情况下替换 Location header。我使用以下命令启用重定向

client.prepareGet(request.getUrl())
             .setFollowRedirect(true)

我所做的是扩展 AsyncCompletionHandler class,然后我从那里 @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,这意味着 Location header 没有被替换。

目前的计划是实现一个在Redirect30xInterceptor.java(https://github.com/AsyncHttpClient/async-http-client/blob/dd459294434a408cff3c65c9f5c402b82d60aaa2/client/src/main/java/org/asynchttpclient/netty/handler/intercept/Redirect30xInterceptor.java)之前运行的拦截器,并更改url.

另一个方案是对下面的代码做一个while循环,每当收到3XX时,在下一个请求中设置一个新的url。

client.prepareGet(request.getUrl())
                             .addHeader("User-Agent", request.getUserAgent())
                             .setProxyServer(proxyServer)
                             .execute(new ResponseAsyncCompletionHandler(request))
                             .toCompletableFuture();

最终目标是将itms://替换为https://,所以下一次请求使用https而不是itms

学习了下,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