Получение URL-адреса перенаправления в Apache HttpComponents

Я использую Apache HttpComponents, чтобы ПОЛУЧИТЬ некоторые веб-страницы для некоторых просканированных URL-адресов. Многие из этих URL-адресов на самом деле перенаправляют на разные URL-адреса (например, потому что они были обработаны сокращателем URL-адресов). В дополнение к загрузке контента я хотел бы разрешить конечные URL-адреса (то есть URL-адрес, который предоставил загруженный контент) или, что еще лучше, все URL-адреса в цепочке перенаправления.

Я просматривал документы API, но понятия не имел, где я мог бы подключиться. Любые подсказки будут очень признательны.


person qqilihq    schedule 24.06.2012    source источник


Ответы (2)


Вот полная демонстрация того, как это сделать с помощью Apache HttpComponents.

Важные детали

Вам нужно будет расширить DefaultRedirectStrategy следующим образом:

class SpyStrategy extends DefaultRedirectStrategy {
    public final Deque<URI> history = new LinkedList<>();

    public SpyStrategy(URI uri) {
        history.push(uri);
    }

    @Override
    public HttpUriRequest getRedirect(
            HttpRequest request,
            HttpResponse response,
            HttpContext context) throws ProtocolException {
        HttpUriRequest redirect = super.getRedirect(request, response, context);
        history.push(redirect.getURI());
        return redirect;
    }
}

Метод expand отправляет запрос HEAD, который заставляет client собирать URI в очереди spy.history, поскольку он автоматически перенаправляется:

public static Deque<URI> expand(String uri) {
    try {
        HttpHead head = new HttpHead(uri);
        SpyStrategy spy = new SpyStrategy(head.getURI());
        DefaultHttpClient client = new DefaultHttpClient();
        client.setRedirectStrategy(spy);
        // FIXME: the following completely ignores HTTP errors:
        client.execute(head);
        return spy.history;
    }
    catch (IOException e) {
        throw new RuntimeException(e);
    }
}

Вы можете установить максимальное количество перенаправлений, за которыми следует что-то разумное (вместо 100 по умолчанию), например:

        BasicHttpParams params = new BasicHttpParams();
        params.setIntParameter(ClientPNames.MAX_REDIRECTS, 5);
        DefaultHttpClient client = new DefaultHttpClient(params);
person Pavel Repin    schedule 16.05.2013
comment
Вау, это было давно, но во время долгого рефакторинга после обновления HttpComponents я интегрировал ваше решение, и оно работает очень хорошо. Благодарю вас! - person qqilihq; 24.01.2016

Один из способов — отключить автоматическую обработку перенаправления, установив для параметр и сделайте это самостоятельно, проверив ответы 3xx и вручную извлекая местоположение перенаправления из заголовка ответов «Местоположение».

person Stephen C    schedule 24.06.2012
comment
Спасибо, сделал так, как вы предложили. Работает! - person qqilihq; 25.06.2012