Ядро компонентов HTTP следует за перенаправлением

#java #http #redirect #core

#java #http #перенаправление #Ядро

Вопрос:

Ну, я пытаюсь найти способ заставить компоненты http следовать перенаправлению, но не нашел ни одного в Google, поэтому я пришел сюда, чтобы попросить о помощи func:

 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;

}
 

Любая помощь с этим тоже? потому что я ничего не могу найти…

Комментарии:

1. Вы уверены, что вам вообще нужен этот сложный код? hc.apache.org/httpcomponents-client-ga/examples.html обычно это срабатывает. Первый пример (обработка ответа) следует за перенаправлением по умолчанию.

2. Уже исправлено с помощью urlconnector.

3. В этом случае вы должны создать новый ответ и принять его. Я мог бы помочь другим людям с той же проблемой, и другие не будут пытаться решить ее снова за вас.

4. Cakestep, не могли бы вы опубликовать свое решение. Я пришел сюда с той же проблемой.

5. Вы находитесь в определенном контексте Android?

Ответ №1:

Я бы рекомендовал вам использовать basic DefaultHttpClient , который поддерживает перенаправление без какой-либо настройки или дополнительного кода. Его поведением можно управлять с помощью 4 параметров, описанных в разделе 5.2 Параметры HttpClient.

Если вы действительно не хотите зависеть от httpcomponents-client , а только от httpcomponents-core , вам нужно будет выбрать реализацию org.apache.http.impl.client.RedirectStrategy и создать свой собственный код для анализа ответа, определить, является ли это допустимым перенаправлением (внимательно прочитайте спецификацию HTTP, это не так просто) и при необходимости запускает новый запрос в цикле.

Мое мнение: нет причин снова писать такой сложный код, и однажды потребуется аутентификация, и вам также придется добавить эту поддержку. Итак, просто полагайтесь на HttpClient.