java - HTTP 组件核心跟随重定向

标签 java http redirect core

好吧,我正试图找到一种方法让 http 组件遵循重定向,但在 google 上没有找到任何方法,所以我来这里寻求帮助 函数:

public String GetSite(String site, String path) throws Exception {

    HttpParams params = new SyncBasicHttpParams();
    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
    HttpProtocolParams.setContentCharset(params, "UTF-8");
    HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
    HttpProtocolParams.setUseExpectContinue(params, true);

    HttpProcessor httpproc = new ImmutableHttpProcessor(new HttpRequestInterceptor[]{
                // Required protocol interceptors
                new RequestContent(),
                new RequestTargetHost(),
                // Recommended protocol interceptors
                new RequestConnControl(),
                new RequestUserAgent(),
                new RequestExpectContinue()});

    HttpRequestExecutor httpexecutor = new HttpRequestExecutor();

    HttpContext context = new BasicHttpContext(null);
    HttpHost host = new HttpHost(site, 80);

    DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
    ConnectionReuseStrategy connStrategy = new DefaultConnectionReuseStrategy();

    context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
    context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);

    try {

        String[] targets = {
            path};

        for (int i = 0; i < targets.length; i++) {
            if (!conn.isOpen()) {
                Socket socket = new Socket(host.getHostName(), host.getPort());
                conn.bind(socket, params);
            }
            BasicHttpRequest request = new BasicHttpRequest("GET", targets[i]);
            request.setParams(params);
            httpexecutor.preProcess(request, httpproc, context);
            HttpResponse response = httpexecutor.execute(request, conn, context);
            response.setParams(params);
            httpexecutor.postProcess(response, httpproc, context);

            if (!connStrategy.keepAlive(response, context)) {
                conn.close();
            } else {
            }
            return (EntityUtils.toString(response.getEntity()));

        }
    } finally {
        conn.close();
    }
    return null;

}

这方面也有帮助吗?因为我找不到任何东西...

最佳答案

我建议您使用基本的 DefaultHttpClient,它支持重定向,无需任何调整或附加代码。它的行为可以通过 section 5.2 HttpClient parameters 中描述的 4 个参数来控制。 .

如果您真的不想依赖httpcomponents-client,而只想依赖httpcomponents-core,您将不得不选择implementation from org.apache.http.impl.client.RedirectStrategy。并创建您自己的代码来解析响应,确定它是否是有效的重定向(仔细阅读 HTTP 规范,这不是那么简单)并在需要时触发循环中的新请求。

我的意见:没有理由再写这么复杂的代码,总有一天会需要身份验证,你也必须添加这种支持。所以,就靠HttpClient吧。

关于java - HTTP 组件核心跟随重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935359/

相关文章:

java - 使用 java 连接到 BMC Bladelogic 配置管理器

http - 在wireshark中数据包的TCP ACK

html - GET 请求中的 "example.com"指的是什么?

java - Java 中称为 nanohttpd 的简单 Web 服务器

apache - 使用 .htaccess 将一个文件夹重定向到另一个文件夹,但保留原始 URL 并阻止对所有其他文件夹的访问

java - 适用于 Java 的 Google HTTP 客户端库抛出 HttpResponseException : 301 Moved Permanently

jsf - 重定向如果 f :viewParam is empty

java - Sonarqube 中的 JVM 错误

java - 为什么我的编译器告诉我有不可编译的源代码?

java - Spring 表单绑定(bind)怎么做呢?无法将类型 [java.lang.String] 的值转换为所需类型