使用 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);
我想在一种情况下替换 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);