Отключить перенаправление для определенных запросов с одним и тем же клиентом, используя 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
    ...
    }
}
Другие вопросы по тегам