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" },