Как я могу использовать информацию http-аутентификации с URL-адреса в Android? - PullRequest
1 голос
/ 12 мая 2011

В моем браузере или в iOS, когда я пытаюсь получить содержимое URL с закодированной информацией аутентификации http в форме

http://myUser:myPassword@www.example.com/secure/area/index.html

Это просто работает.Я получаю URL-адреса от веб-службы, и я хотел бы не пытаться проанализировать их на предмет их подлинной информации HTTP, если я могу помочь.Есть ли способ сделать что-то подобное в Android без фактического разбора URL-адресов?В качестве альтернативы, как лучше всего это сделать?

ОБНОВЛЕНИЕ: я обнаружил, что когда я пытаюсь установить информацию аутентификации в заголовке авторизации, я получаю очень странное исключение FileNotFoundException.

Воткод, который я использую:

        URL url = new URL(urlString);
        URLConnection connection;
        String authority = url.getAuthority();
        if (authority.contains("@")) {
            String userPasswordString = authority.split("@")[0];
            url = new URL(urlString.replace(userPasswordString + "@", ""));
            connection = url.openConnection();
            String encoded = new String(Base64.encode(userPasswordString.getBytes(), Base64.DEFAULT), "UTF-8");
            connection.setRequestProperty("Authorization", "Basic " + encoded);
        } else {
            connection = url.openConnection();
        }

        InputStream responseStream = connection.getInputStream();

Кажется, что вся информация проверена, я убедился, что URL-адрес правильный, строка base64 правильная, и файл, безусловно, на сервере - яу меня нет проблем, открывая его с помощью Firefox, и Firebug показывает все нужные заголовки, соответствующие тому, что я отправил, насколько я могу судить.Однако я получаю следующую ошибку (URL-адрес хоста изменен для защиты невинных):

java.io.FileNotFoundException: http://a1b.example.com/grid/uploads/profile/avatar/user1/custom-avatar.jpg
  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1061)

Есть идеи, о чем идет речь?

Я изучил использование HttpClient, но увидел, чтов выпуск 16041 рекомендуется, чтобы мы предпочли URLConnection.

Ответы [ 2 ]

2 голосов
/ 12 мая 2011

Похоже, ваш браузер применяет некоторые дополнительные правила для разбора URL.В Android вы можете использовать механизм аутентификации HTTP-клиента, такой как BASIC и DIGEST, чтобы делать то же самое.Какой из них вы выберете, зависит от сервера, на котором вы пытаетесь пройти аутентификацию.

Вот хорошая страница , с которой можно начать.

1 голос
/ 12 мая 2011

К сожалению, на Android вы не можете передать информацию о пользователе (имя пользователя / пароль) в этом формате в java.net.URL или HttpClient и заставить ее работать как в браузере.

Я быдля этого рекомендуем использовать URI (см. http://download.oracle.com/javase/1.5.0/docs/api/index.html?java/net/URI.html): передайте ваш URL конструктору URI, который принимает строку, а затем вы можете извлечь информацию о пользователе (используя getUserInfo()). Затем вы можете использовать либо классы авторизации HttpClient (см. http://developer.android.com/reference/org/apache/http/auth/package-summary.html) или создайте базовый заголовок аутентификации самостоятельно (пример приведен на http://www.avajava.com/tutorials/lessons/how-do-i-connect-to-a-url-using-basic-authentication.html).

...