1. 程式人生 > >Android OKHttp3的使用和下載/上傳圖片

Android OKHttp3的使用和下載/上傳圖片

一、OKHttp3簡介

OKHttp是一個處理網路請求的輕量級開源框架,由移動支付Square公司貢獻,用於替代HttpUriConnection和Apache HTTPClient,進行http請求,從Android 4.4 開始HttpUrlConnection底層實現採用OKHttp,而HttpClient已經廢棄,並且在Android 6.0 API 23 後已被移除。

OKHttp功能:

  • post,get等請求
  • 檔案上傳下載
  • 載入圖片
  • 支援請求回撥,直接返回物件、物件集合
  • 支援session的保持

OKHttp優點:

  • 支援HTTP2/SPDY(SPDY是Google開發的基於TCP的傳輸層協議,用以最小化網路延遲,提升網路速度,優化使用者的網路使用體驗)
  • socket自動選擇路線,支援重連,擁有自動維護的socket連線池,減少握手次數,減少了請求延遲,共享socket,減少了對伺服器的請求次數
  • 基於Headers的快取策略減少重複的網路請求
  • 擁有Interceptors輕鬆處理請求與相應(自動處理GZip壓縮)

當然還有很多其他主流框架,每個框架的優缺點不同,應當根據需求選擇合適的框架,比如Google推出的Volley,對頻繁的、資料量小的網路請求表現較好,而不適合處理大資料量的操作(比如下載檔案),Retrofit基於註解,專注於介面封裝,相比之下OKHttp效能較高使用靈活,同時也需要我們自己再進行一層封裝。

二、OKHttp3使用

首先要新增OKHttp3的依賴

compile 'com.squareup.okhttp3:okhttp:3.10.0'
compile 'com.squareup.okio:okio:1.14.0'

以登入為例,post方法使用如下

public static String login(String url, String sid, String password) throws IOException {
    OkHttpClient okHttpClient = new OkHttpClient();
    FormBody formBody = new FormBody.Builder()
            .add("sid", sid)
            .add("password", password)
            .build();
    Log.d("FormBody", formBody.toString());
    Request request = new Request.Builder()
            .url(url+"/login")
            .post(formBody)
            .build();
    Response response = okHttpClient.newCall(request).execute();
    return response.body().string();
}

同樣get方法形式如下

public static String get(String url) throws IOException{
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder()
            .url(url)
            .build();
    Response response = okHttpClient.newCall(request).execute();
    return response.body().string();
}

需要注意的是,url前面必須包含 http://,後面跟冒號和埠號

三、OKHttp3下載和上傳圖片

使用get方法下載圖片,返回byte陣列

/**
 * 下載圖片
 * @param url
 * @param imagePath 圖片路徑
 * @return byte[]
 * @throws IOException
 */
public static byte[] downloadImage(String url, String imagePath) throws IOException {
    OkHttpClient okHttpClient = new OkHttpClient();
    Request request = new Request.Builder()
            .url(url+"/show?fileName="+imagePath)
            .build();
    Response response = okHttpClient.newCall(request).execute();
    byte[] bytes = response.body().bytes();
    return bytes;
}

使用post方法上傳圖片

/**
 * 上傳圖片
 * @param url
 * @param imagePath 圖片路徑
 * @return 新圖片的路徑
 * @throws IOException
 * @throws JSONException
 */
public static String uploadImage(String url, String imagePath) throws IOException, JSONException {
    OkHttpClient okHttpClient = new OkHttpClient();
    Log.d("imagePath", imagePath);
    File file = new File(imagePath);
    RequestBody image = RequestBody.create(MediaType.parse("image/png"), file);
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
            .addFormDataPart("file", imagePath, image)
            .build();
    Request request = new Request.Builder()
            .url(url+"/uploadImage")
            .post(requestBody)
            .build();
    Response response = okHttpClient.newCall(request).execute();
    JSONObject jsonObject = new JSONObject(response.body().string());
    return jsonObject.optString("image");
}