2011-05-12 21 views
1

在我的浏览器,或在iOS上,当我试图让与编码HTTP认证信息的URL的内容,形式如何从Android中的URL使用http认证信息?

http://myUser:[email protected]/secure/area/index.html 

这只是工作。我从Web服务获取URL,并且如果可以帮助的话,我想避免尝试解析它们的HTTP认证信息。有没有办法在没有真正解析URL的情况下在Android中做类似的事情?或者,最好的方法是什么?

更新: 我发现,当我尝试在授权标头中设置身份验证信息时,出现一个非常奇怪的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显示了所有正确的标题,与我发送的内容相匹配。我得到虽然是以下错误(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,但看到在Issue 16041建议我们更喜欢URLConnection。

回答

2

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

Here is a good page让你开始。

+0

更新的问题 – 2011-05-12 15:40:32

1

不幸的是,在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)。

+0

更新的问题 – 2011-05-12 15:40:03