如何在Android中使用来自URL的http身份验证信息?

时间:2011-05-12 13:56:02

标签: android httpurlconnection http-authentication

在我的浏览器或iOS中,当我尝试以

格式获取带有编码的http身份验证信息的URL的内容时
http://myUser:myPassword@www.example.com/secure/area/index.html

它只是有效。我从Web服务获取URL,如果我可以帮助它,我想避免尝试解析它们的HTTP身份验证信息。有没有办法在Android中做类似的事情而不实际解析URL?或者,最好的方法是什么?

更新: 我发现当我尝试在Authorization标头中设置身份验证信息时,我得到一个非常奇怪的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();

所有的信息似乎都检查出来,我已经验证了网址是否正确,base64字符串是否正确,文件肯定在服务器上 - 我在使用Firefox打开它时没有任何问题,并且Firebug显示所有正确的标题,与我所发送的内容相匹配。我得到的是以下错误(网址主机已更改以保护无辜者):

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,但是在Issue 16041中看到了我们建议我们更喜欢URLConnection。

2 个答案:

答案 0 :(得分:2)

看起来您的浏览器正在应用一些额外的规则来解析URL。在Android中,您可以使用HTTP Client的身份验证机制(如BASIC和DIGEST)执行相同的操作。您选择哪一个取决于您尝试进行身份验证的服务器。

Here is a good page让你开始。

答案 1 :(得分:1)

不幸的是,在Android上,您无法将该格式的用户信息(用户名/密码)传递给java.net.URL或HttpClient,并使其像浏览器一样工作。

我建议使用URI(请参阅http://download.oracle.com/javase/1.5.0/docs/api/index.html?java/net/URI.html)来执行此操作:将URL传递给接受String的URI构造函数,然后您可以提取用户信息(使用getUserInfo())。然后,您可以使用HttpClient的授权类(请参阅http://developer.android.com/reference/org/apache/http/auth/package-summary.html)或自己构建基本的auth标头(示例在http://www.avajava.com/tutorials/lessons/how-do-i-connect-to-a-url-using-basic-authentication.html处给出。)