OKHttp 是支援 HTTP & HTTP/2 的開源框架,透過它可以很方便發送 HTTP 請求。
具有以下特性:
1.API 設計簡單,可以透過幾行 code 即可發送 HTTP 請求
2.支援同步,異步請求。同步請求會 block 目前的 Thread,異步請求則不會 block
OKHttp官網連結
最新版本釋出
以下紀錄最基本的 get, post, post with json format 的使用方式。

1.相依性

在 module 的 build.gradle 加入

dependencies {
  ...
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
}

Note:目前(2018/09/28)最新版本為 3.11.0

2. Using in code

為了封裝 OKHtt p建立了 OKHttpWrapper 類別,外部皆透過該類別來使用OKHttp。
OKHttpWrapper.java

import android.util.Log;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.json.JSONObject;
public class OKHttpWrapper {
  private static final String TAG = OKHttpWrapper.class.getSimpleName();
  private static OkHttpClient sOKHttpClient = new OkHttpClient();
  public static void sendGet(String URL, Map<String, String> requestParameter, Callback callback) {
    Set<String> keys = requestParameter.keySet();
    for (String value : keys) {
      URL = new StringBuilder(URL + "&" + value + "=" + requestParameter.get(value)).toString();
    }
    Request request = new Request.Builder().url(URL).build();
    Call call = sOKHttpClient.newCall(request);
    call.enqueue(callback);
  }
  public static void sendPost(String URL, Map<String, String> requestParameter, Callback callback) {
    FormBody.Builder builder = new FormBody.Builder();
    Set<String> keys = requestParameter.keySet();
    for (String key : keys) {
      builder.add(key, requestParameter.get(key));
    }
    Request request = new Request.Builder().url(URL).post(builder.build()).build();
    Call call = sOKHttpClient.newCall(request);
    call.enqueue(callback);
  }
  public static void sendPostWithJSONFormat(String URL, Map<String, String> requestParameter,
      Callback callback) {
    MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    RequestBody requestBody = RequestBody.create(JSON, new JSONObject(requestParameter).toString());
    Request request = new Request.Builder().url(URL).post(requestBody).build();
    Call call = sOKHttpClient.newCall(request);
    call.enqueue(callback);
  }
}

第 19 行建立 OKHttpClient 實體,各個請求皆透過該實體來動作。
第 21 行 sendGet 方法為發送 GET 使用,第 1 個參數為接收請求的 URL,第 2 個為請求的參數,第 3 個參數為發送請求之後的回應。
第 31 行 sendPost 方法為發送 POST 使用,第 1 個參數為接收請求的 URL,第 2 個為請求的參數,第 3 個參數為發送請求之後的回應。
第 44 行 sendPostWithJSONFormat 方法為發送 POST 但參數的格式為 JSON,第 1個參數為接收請求的 URL,第 2 個為請求的參數,第 3 個參數為發送請求之後的回應。
可以看到透過 OKHttp 發送請求相當簡單,接下來示範外部如何呼叫OKHttpWrapper。接收請求的Server使用 httpbin
以下為外部

  private void testSendRequest(String name, String id) {
    Map<String, String> httpParameter = new HashMap<>();
    httpParameter.put("Name", name);
    httpParameter.put("ID", id);
    OKHttpWrapper.sendPostWithJSONFormat(
        "http://httpbin.org/post", httpParameter, new Callback() {
          @Override
          public void onFailure(Call call, IOException e) {
          }
          @Override
          public void onResponse(Call call, Response response) throws IOException {
            Log.d(TAG, TAG+" response:"+response.body().string());
          }
        });
  }

第 2~4 行為組裝請求的參數。
第 6 行呼叫 OKHttpWrapper 的 sendPostWithJSONFormat 方法
第 1 個參數為為接受請求的 URL,第 2 個參數為請求的參數,第3個參數為發送請求後的回應,其中 onFailure 為請求失敗的回應。onResponse 則為請求成功的回應。

        testSendRequest("Foxx", "999");
        testSendRequest("Peter", "000");
        testSendRequest("May", "111");

Output

 "json": {
        "ID": "999",
        "Name": "Foxx"
      },
 "json": {
        "ID": "000",
        "Name": "Peter"
      },
 "json": {
        "ID": "111",
        "Name": "May"
      },