2013-02-15 4 views
4

Мой код (ниже) пытается получить окончательный URL-адрес, возвращенный с сервера, который выполняет некоторую переадресацию. Он отлично работает, пока URL-адреса имеют схему http. Моя проблема возникает, когда я хочу вернуть URL-адрес с другой схемой. В конечном итоге я хочу, чтобы в некоторых ситуациях вернуть рынок: // url или другие схемы запуска приложений, поскольку это для Android, и я хочу начать с ними намерения.Получить окончательный URL-адрес перенаправленного запроса с нетрадиционной схемой

Таким образом, это позволяет мне получить окончательный URL-адрес http-адреса, но когда конечный URL-адрес является рынком: // он выдает исключение (java.lang.IllegalStateException: схема «рынок» не зарегистрирован), а затем getURI не дает этого, он предоставит все, что было до этого.

DefaultHttpClient client = new DefaultHttpClient(); 
    HttpContext httpContext = new BasicHttpContext(); 
    HttpGet httpGet = new HttpGet(mInitialUrl); 

    try { 
     client.execute(httpGet, httpContext); 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 

    // Parse out the final uri. 
    HttpHost currentHost = (HttpHost) httpContext.getAttribute(ExecutionContext.HTTP_TARGET_HOST); 
    HttpUriRequest req = (HttpUriRequest) httpContext.getAttribute(ExecutionContext.HTTP_REQUEST); 

    return (req.getURI().isAbsolute()) ? req.getURI().toString() : (currentHost.toURI() + req.getURI()); 

Теперь, я мог бы просто зарегистрировать рынок: // в качестве схемы, но я не хочу, чтобы жестко прописать заранее, что действительные схемы, я просто хочу, чтобы принять их и вернуть их то, что они находятся.

Любые идеи? Может быть, я даже не поступил правильно. (Изменение поведения сервера в данном случае не является вариантом ... Мне нужно только иметь дело с переадресацией.)

Моя надежда заключается в том, что кто-то может сказать мне, как заставить HttpClient игнорировать схему, или, по крайней мере, сохранить окончательный URI, к которому он пытается получить доступ.

+0

Быстрый тест с 'URLConnection' работает для меня. Вы можете использовать его вместо этого? – BalusC

+0

Ооо, да. Я сделаю это. – Turnsole

+0

Хорошо. Я отправил ответ. – BalusC

ответ

2

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

HttpURLConnection connection = (HttpURLConnection) new URL(mInitialUrl).openConnection(); 
connection.setInstanceFollowRedirects(true); 
String location = connection.getHeaderField("location"); 
+0

connection.getHeaderField ("location") всегда null для меня. Я попытался вставить connection.connect(), но не повезло. – Turnsole

+0

Смешная вещь ... если я изменяю setInstanceFollowRedirects на false, тогда она предоставляет значение перенаправления для «location». По-видимому, это место является частью заголовка перенаправления, который он не смог бы получить, если бы он автоматически переадресовался? (Моя подсказка была здесь: http://stackoverflow.com/questions/3786161/cant-get-response-header-location-using-javas-urlconnection.) – Turnsole

+0

Проблема в наличии нескольких перенаправлений. Я могу получить первый переадресацию, но поскольку он не следует за ней до конца, я не могу получить окончательный вариант. – Turnsole

Смежные вопросы