在開發應用程式的時候常會需要連到網際網路上取得一些資料或是傳送一些資料出去,而這當中最常使用的協定就是HTTP了!在Java中,若要使用HTTP、HTTPS、FTP等協定來進行連線,可以使用java.net套件下的URLConnection。但是URLConnection過於底層,使用起來十分麻煩,因此許多人會改用Apache HttpComponents提供的HttpClient,只不過HttpClient的功能實在是太多了,需要引用一大堆Apache的Library,使用起來效能也似乎不如直接使用URLConnection。這篇文章將提供一個較為簡易的方式實作出HTTP和HTTPS的GET與POST Request方法,以及FTP檔案下載的功能。
MagicURLNetwork是以URLConnection為基礎,支援HTTP和HTTPS協定的GET、POST、PUT、HEAD、DELETE Request方法,以及FTP檔案下載的函式庫。
取得MagicURLNetwork
使用MagicURLNetwork
GET
使用MagicURLNetwork發出GET Request的方法很簡單,以Youtube搜尋來舉例,程式如下:
final String keyword = "magiclen"; //查詢關鍵字
final MagicURLNetwork network = MagicURLNetwork.GET("https://www.youtube.com/results");
network.setParameter("search_query", keyword); //加入參數
network.open();
System.out.println(network.getResultAsString()); //傳回HTML結果
如果要GET的資料不是文字,而是一個二進制(Binary)的檔案的話,可以使用setTargetFile方法,將檔案儲存在磁碟中,如以下程式:
final MagicURLNetwork network = MagicURLNetwork.GET("https://wordpress.org/latest.zip");
network.setTargetFile(new File("/home/magiclen/wp.zip")); //下載的資料將會存到這個檔案內
network.open(); //開啟URL
System.out.println(network.getResultAsFile().length()); //下載後,顯示出檔案的大小
當然要將文字存到檔案內也是可以的,只是通常不會特地這樣做。
POST、SinglePOST、PUT、HEAD、DELETE
MagicURLNetwork其餘的Requeest方式,跟GET可以幾乎是一模一樣,看用途來使用。
加入NetworkListener
如果要取得MagicURLNetwork目前的連線狀況和發生錯誤時的錯誤訊息,可以設定一個NetworkListener物件給MagicURLNetwork,如以下程式:
final MagicURLNetwork network = MagicURLNetwork.GET("https://wordpress.org/latest.zip");
network.setTargetFile(new File("/home/magiclen/wp.zip"));
network.setNetworkListener(new MagicURLNetwork.NetworkListener() {
@Override
public void onStarted() {
}
@Override
public void onRunning(final boolean receiving, final long currentBytes, final long totalBytes) {
System.out.printf("%s: %d/%d%n", receiving ? "Receiving" : "Sending", currentBytes, totalBytes);
}
@Override
public void onFailed(final String message, final boolean attemptDisconnect) {
System.err.println(message);
}
@Override
public void onFinished(final JSONObject resultHeader, final Object result) {
System.out.println(result);
}
});
new Thread(() -> network.open()).start();