接觸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();
}