Отключить перенаправление для определенных запросов с одним и тем же клиентом, используя HttpClient
Я хотел бы знать, как я могу отключить перенаправление для конкретных запросов при использовании HttpClient. Прямо сейчас мой клиент разрешает или запрещает перенаправления для всех своих запросов. Я хочу иметь возможность делать некоторые запросы с перенаправлениями, но некоторые с отключенным перенаправлением, все с тем же клиентом. Является ли это возможным?
Пример использования двух клиентов (это то, чего я хочу избежать):
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
public class MyClass {
public static void main(String[] args) throws Exception {
// Redirected client
CloseableHttpClient client = HttpClients.createDefault();
HttpGet get = new HttpGet("http://www.google.com");
client.execute(get);
// Non-redirected client
CloseableHttpClient client2 = HttpClientBuilder.create().disableRedirectHandling().build();
HttpGet get2 = new HttpGet("http://www.google.com");
client2.execute(get2);
}
}
1 ответ
Вы можете реализовать свой собственный RedirectStrategy
обрабатывать перенаправление, как вы хотите, и использовать setRedirectStrategy
из HttpClientBuilder
позволить http-клиенту использовать вашу стратегию перенаправления.
Вы можете проверить реализации DefaultRedirectStrategy и LaxRedirectStrategy.
Важная часть isRedirected
метод RedirectStrategy
, Вам нужно вернуть true
или же false
в зависимости от того, хотите ли вы перенаправить конкретный запрос или нет. Исполнитель запроса HTTP будет вызывать этот метод перед выполнением фактического перенаправления.
Например, вы можете продлить DefaultRedirectStrategy
и переопределить isRedirected
метод
...
public class MyRedirectStrategy extends DefaultRedirectStrategy {
...
@Override
public boolean isRedirected(
final HttpRequest request,
final HttpResponse response,
final HttpContext context) throws ProtocolException {
// check request and return true or false to redirect or not
...
}
}