[Android]HttpURLConnection 之POST&GET手把手完整教學解析
Android中可透過兩種Class進行連線實作,分別是 org.apache.http 所提供的 HttpClient 以及 java.net.HttpURlConnection的 HttpURlConnection。不過由於HttpURLConnection 相較 Http Client 具有更佳的效率,能夠有效的減少response caching 並降低功耗,因此 Google 官方已經在 SDK 23(Android 6.0)以上的版本棄用了 HttpClient,如果還要使用的話,可以在gradle中加入以下的 dependency[參考官方的教學]。
android {
useLibrary 'org.apache.http.legacy'
}
而本篇將透過HttpURLConnection 進行連線的教學。
一、POST
由於android 限定連線必須透過AsyncTask進行[關於AsyncTask],因此我們首先新增一個AsyncTask的Class,如下圖。
接下來撰寫POST Method 並在doInbackground中呼叫,如下圖。
其中我們先宣告一個url object 傳入URL連結,並利用 openConnection(),得到一個URLConnection 的連線,並且記得將它 cast 成 HttpURLConnection 型態,
此時我們就得到了一個HttpURLConnection,可以開始進行連線方法與參數的設定囉!
setRequestMethod(String method)
設定連線方法,可傳入"GET", "POST", "HEAD", "OPTIONS", "PUT", "DELETE", "TRACE"等參數。setRequestProperty(String key, String value)
為設定Header的參數,使用上很簡單,只要分別將key與value傳入就可以囉。標示日期的"date",認證資訊的"authentication",以及內容型態的"content-type"都是常用的key。setDoInput(boolean doinput)
這是對於APP端而言,如果需要有'input',也就是接收server的回傳結果,則需要設為true,反之,則設為false。setDoOutput(boolean dooutput)
一樣是對於App端而言,如果有需要'output',也就是傳送資料給 server,則需要設為true,反之設為 false。需要特別注意的是,當設為 true 時,connection 會自動將RequestMethod 設為"POST"(這也很符合直觀的想法)。
由於此處我們需要同時傳送參數給server,並接收結果,所以setDoInput()與setDoOutput()都設為true。
然而利用 HttpURlConnection 該怎麼在body傳入參數呢?
我們可以透過DataOutputStream 這個Class 來達到目的,在宣告一個DataOutputStream Object後,將參數字串傳入writeBytes()中,編碼為Bytes形式,完成後再呼叫flush(),將資料沖出,用完之後再呼叫closse()將它關掉。
值得一提的是,在參數字串的編寫方式中
Value的值必須用 URLEncoder.encode() 編碼為 url的形式
而各參數之間必須使用 "&" 做為區隔,否則整個字串將會被認為是同一個value
以上就完成了POST的request。接下來如果要接收結果的話,則可以透過InputStream接受結果,並將其透過 InputStreamReader與 BufferedReader 轉換為字串即可。同時我們可以利用getResponseCode()這個method來查看response status並了解連線狀況[Http status]。
二、Get
相較於POST,GET就簡單多囉,只要將HttpURLConnection中setDoOutput()設為false,setRequestMethod()為"GET",並設定Header的參數,就可以完成了request設置,接著與POST中接收Response的方法相同,只要透過InputStream, InputStreamReader與 BufferedReader 接收結果並轉換為字串即可囉!