Как получить Android HttpURLConnection для обработки перенаправления - PullRequest
0 голосов
/ 12 октября 2018

Я создаю приложение, которое в основном загружает изображение с определенного мной URL-адреса и сохраняет его на устройстве пользователя.Я делаю это с:

 URL url = new URL("http://speedtest.clotheslinedigital.com");
 HttpURLConnection c = (HttpURLConnection) url.openConnection();
 c.setRequestMethod("GET");
 c.connect();

И затем, проверив, что хранилище работает правильно и создав пустой файл для сохранения на устройстве, я использую поток вывода файла и поток ввода для загрузкифайл на устройство.

В целях тестирования я только что использовал ссылку для скачивания Dropbox на изображение, и оно отлично работает.Однако в производственной среде я хочу использовать перенаправление субдоменов DNS для ссылки на файл вместо жестко закодированной ссылки в моем приложении, чтобы мне не приходилось обновлять приложение, если я изменил путь к файлу, который требуется приложениюдля загрузки.

Для тестирования я установил перенаправление 301 через мой Godaddy DNS, который перенаправляет на ссылку Dropbox, которую я использовал для тестирования в жестком коде.Субдомен отлично работает, когда я ввожу субдомен в своем браузере, но когда я хардкору URL субдомена в свое приложение, ничего не загружается, а просто остается пустой файл (тот, который был создан после запроса, который будет использоваться для хранениязагруженный файл).

Я попытался использовать setFollowRedirects () и установить для него значение true, которое, по моему мнению, является значением по умолчанию, но я все равно попытался, но все равно не получилось.

Я подумал, может быть,проблема заключалась в том, что HttpURLConnection не мог обработать коды ответа 301 с сервера, но я посмотрел заголовок ссылки Dropbox, и он 301 перенаправляет приложение перед загрузкой файла без проблем.

Любые идеикак это исправить?

1 Ответ

0 голосов
/ 13 октября 2018

После еще одного исследования кажется, что я должен вручную обработать перенаправление в моем коде.Я в основном сделал это, слушая код ответа на запрос соединения.Если это 301 или 302 для перенаправления, я должен взять поле Location из заголовка и передать его через соединение.

Это мой код, чтобы сделать это:

boolean isRedirect;
do {
    if (c.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || c.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) {
        isRedirect = true;
        String newURL = c.getHeaderField("Location");
        c = (HttpURLConnection) new URL(newURL).openConnection();
    } else {
        isRedirect = false;
    }
} while (isRedirect);

Нет необходимости заключать все это в своего рода цикл, но это позволит коду работать должным образом, даже если у вас есть несколько перенаправлений, которые необходимо обработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...