2009-12-15 166 views
0

我想抓住從美味的一些數據,使用URL類,請求HTTPS URL

URL url = URL(u); 
url.openStream(); 

開放流失敗,401,

網址我現在用的就是,

字符串(」 https://「+ creds +」@ api.del.icio.us/v1/posts/recent「);

creds是base64編碼的字符串例如用戶:傳遞編碼,我也試過非編碼形式,也失敗了,有人可以告訴我我失蹤了嗎?

回答

3

UPDATE: 如下指出,URL類確實有一些機制來處理用戶身份驗證。然而,OP是正確的,del.icio.us服務返回401使用代碼(如上所示)(使用我自己的帳戶進行驗證,並且我提供了正確的憑據......在未經編碼的url中發送它們)。

修改的代碼略有下降,但是,通過手動指定授權頭工作得很好:

URL url = new URL("https://api.del.icio.us/v1/posts/suggest"); 
    byte[] b64 = Base64.encodeBase64("username:pass".getBytes()); 
    URLConnection conn = url.openConnection(); 
    conn.setRequestProperty("Authorization", "Basic " + new String(b64)); 
    BufferedReader r = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
    while(r.ready()){ 
     System.out.println(r.readLine()); 
    } 
+0

是的問題是美味,如果你有一個新的帳戶,你需要使用他們的API的V2這就是爲什麼呼叫失敗。 – 2009-12-16 14:13:12

2

您需要提供這樣的密碼認證,

  Authenticator.setDefault(new Authenticator() 
      { 
       @Override protected PasswordAuthentication getPasswordAuthentication() 
       { 
        return new PasswordAuthentication(username, 
          password.toCharArray() 
          ); 
       } 
      }); 

然而,這將增加往返,因爲它必須等待401。您可以像這樣預先設置驗證標頭,

 String credential = username + ":" + password; 
     String basicAuth = "Basic " + 
       Base64.encode(credential.getBytes("UTF-8")); 
     urlConnection.setRequestProperty("Authorization", basicAuth);