使用 HttpClient 对同一客户端的特定请求禁用重定向

Disable redirect for specific requests with the same client using 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);
    }
}

您可以实现自己的 RedirectStrategy 来根据需要处理重定向,并使用 setRedirectStrategyHttpClientBuilder 让 http 客户端使用您的重定向策略。

您可以检查 DefaultRedirectStrategy and LaxRedirectStrategy 实现以供参考。

重要的部分是 RedirectStrategyisRedirected 方法。您需要 return truefalse 取决于您是否要重定向特定请求。 Http 请求执行器 will be calling 此方法在执行实际重定向之前。

例如,您可以扩展 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
    ...
    }
}