天天看點

java小白日記1--http請求添加Authorization驗證

接觸java一年有餘,如今第一次動手寫相關部落格。以往都是在各為前輩的文章裡尋求幫助,現在我來分享一些自己遇到的問題。

問題的經過是這樣,我寫的一個小程式要去公司的一台伺服器上抓取一個頁面資料,這台伺服器前段時間因為故障重新開機了一下,不知為何再去抓取的時候會報io異常,資訊代碼401,在網上查了一下,是需要Authorization驗證。和同僚問到了驗證的使用者密碼,但是不知道怎樣在請求時添加認證資訊。查API,翻來翻去隻發現應該是通過 HttpURLConnection 的 setRequestProperty(String key, String value) 方法來實作,但不知道 key 和 value 分别應該怎麼寫。終于,去谷歌(思維習慣要改啊)……

那麼,解決方法如下:

        關鍵代碼:

String authString = user + ":" + password;

byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());

String authStringEnc = new String(authEncBytes);

connection.setRequestProperty("Authorization", "Basic " + authStringEnc);

其中 Base64.encodeBase64(authString.getBytes()); 需要用到 commons-codec.jar 包

完整的下載下傳代碼如下

public String DownloadFromUrl(String urlstr,String code,String user,String password) throws MalformedURLException{

  StringBuilder data = new StringBuilder();

  URL url = new URL(urlstr);

  int counts = 0;

  while(true){

   try {

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();

    String authString = user + ":" + password;

//    System.out.println("auth string: " + authString);

    byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());

    String authStringEnc = new String(authEncBytes);

    connection.setRequestProperty("Authorization", "Basic " + authStringEnc);

//    System.out.println("Base64 encoded auth string: " + authStringEnc);

    connection.setRequestProperty("User-Agent", "MSIE 7.0");

    connection.setConnectTimeout(5000);

    BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream(), code));

    String line = null;

    while ((line = br.readLine()) != null) {

     data.append(line);

     data.append("\r\n");

    }

    connection.disconnect();

    break;

   } catch (ConnectException e) {          

    if(counts >=5){

     System.out.println(urlstr+" : "+e.toString());

//     e.printStackTrace();

     return null;

    }

    counts++;

    System.out.println("再次嘗試");

    continue;

   } catch (Exception e) {          

    if(counts >=5){

     System.out.println(urlstr+" : "+e.toString());

//     e.printStackTrace();

     return null;

    }

    counts++;

    System.out.println("再次嘗試");

    continue;

   }

  }

  return data.toString(); 

 }