1. 程式人生 > >網路請求三方庫——OkHttp

網路請求三方庫——OkHttp

  我們知道在Android開發中是可以直接使用現成的API進行網路請求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之後 HttpClient 已經被廢棄,由於此前一直很流行的三方庫 android-async-http 是基於 HttpClient 的,所以作者已經放棄了維護 android-async-http 庫,我們在專案中也儘量不要使用這個庫。

  OkHttp是Squaur公司開源的一個高效能Http請求庫,它的職責同 HttpURLConnention 是一樣的,支援SDPY、Http 2.0、websocket,支援同步、非同步,而且OkHttp又封裝了執行緒池、資料轉換、引數使用、錯誤處理等,API使用起來更加方便。

  這裡首先簡單的介紹一下最新版 OkHttp 3.4.1 的使用以及對於同步GET和POST請求的簡單封裝,後續會補上非同步GET和PST請求、原始碼解析等內容。

OkHttp同步GET、POST請求網路

  下面程式碼封裝了兩個使用OkHttp同步GET、POST請求網路的API,伺服器返回來的都是JSON格式的字串,而對於POST請求,客戶端提交上去的也是JSON格式的字串,原始碼如下:

/**
 * Created by stevewang on 2016/7/28.
 */
public class OkHttpUtils
{
    private static
final OkHttpClient mClient = new OkHttpClient(); public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8"); /** * GET方式同步請求網路,伺服器端返回JSON格式的響應 * * @param urlString * @return * @throws IOException */ public static
String getStringFromURL(String urlString) throws IOException { // 1. 獲取Request物件 Request request = new Request.Builder() .url(urlString) .build(); // 2. 獲取Call物件 Call call = mClient.newCall(request); // 3. 呼叫同步請求方法execute(),獲取Response物件, Response response = call.execute(); // 4. 獲取ResponseBody物件 ResponseBody responseBody = response.body(); if(responseBody != null) { // 5. 從ResponseBody物件中取出伺服器端返回資料 return responseBody.string(); } return null; } /** * POST方式同步請求網路,向伺服器端提交JSON格式的請求,伺服器端返回JSON格式的響應 * * @param urlString * @param jsonRequest * @return * @throws IOException */ public static String postJsonToURL(String urlString, String jsonRequest) throws IOException { // 1. 首先構造RequestBody物件,指定了MediaType為JSON,這一步是POST請求與GET請求的主要區別 RequestBody requestBody = RequestBody.create(MEDIA_TYPE_JSON, jsonRequest); // 2. 獲取Request物件,將RequestBody放置到Request物件中 Request request = new Request.Builder() .url(urlString) // .addHeader(name, value) // 新增請求頭 .post(requestBody) .build(); // 3. 獲取Call物件 Call call = mClient.newCall(request); // 4. 呼叫同步請求方法execute(),獲取Response物件, Response response = call.execute(); // 5. 獲取ResponseBody物件 ResponseBody responseBody = response.body(); if(responseBody != null) { // 6. 從ResponseBody物件中取出伺服器端返回資料 return responseBody.string(); } return null; } }