2011-05-12 50 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