okHttp 是 Square 推出的一套 Library,他提供我們快速的建立一個輕量化的 HttpClient,透過他的 GET.POST.PUT.DELETE.PATCH... 等方法來操作後端 api,目前 release 到 v3.0.1,類似的 Library 還有 Google 的 Volley
dependency 位址
compile 'com.squareup.okhttp3:okhttp:3.0.1'
以下示範 GET 與 POST 如何使用~
測試時記得在 Manifest 要加上網路權限
<uses-permission android:name="android.permission.INTERNET" />
AsyncTask getTask = new AsyncTask() { @Override protected Object doInBackground(Object[] params) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://api.github.com/search/repositories?q=abcdefghijklmnopq") .get() .build(); try { Response response = client.newCall(request).execute(); System.out.println("狀態>>>"+response.code()); System.out.println("資料>>>"+response.body().string()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } }; getTask.execute();
AsyncTask postTask = new AsyncTask() { @Override protected Object doInBackground(Object[] params) { OkHttpClient client = new OkHttpClient(); MediaType JSON = MediaType.parse("application/json; charset=utf-8"); RequestBody body = RequestBody.create(JSON, "{\"Name\":\"anson\",\"Age\":18}"); Request request = new Request.Builder() .url(yourUrl) .post(body) .build(); try { Response response = client.newCall(request).execute(); System.out.println("狀態>>>"+response.code()); System.out.println("資料>>>"+response.body().string()); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } return null; } }; postTask.execute();
有發現GET與POST的使用方法幾乎一模一樣嗎
只差在POST時需要給資料(RequestBody)而已~~
其他的PUT.DELETE.PATCH...以此類推
下面介紹一些常用到的設定
使用 Builder 來操作
OkHttpClient.Builder builder = new OkHttpClient.Builder();
Timeout 若不設定,預設為10秒
builder.connectTimeout(30, TimeUnit.SECONDS); builder.readTimeout(15, TimeUnit.SECONDS); builder.writeTimeout(20, TimeUnit.SECONDS);
final int CACHE_SIZE = 10 * 1024 * 1024; builder.cache(new Cache(MainActivity.this.getExternalCacheDir(), CACHE_SIZE));
需要與 Cache 一起使用
builder.addNetworkInterceptor(new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Response originalResponse = chain.proceed(chain.request()); if (true) { int maxAge = 60; //有網路時..讀取快取1分鐘內資料 return originalResponse.newBuilder() .header("Cache-Control", "public, max-age=" + maxAge) .build(); } else { int maxStale = 60 * 60 * 24 * 28; //無網路時..讀取快取4周內資料 return originalResponse.newBuilder() .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale) .build(); } } });
OkHttpClient client = builder.build();
Request request = new Request.Builder() .url("URL") .addHeader("NAME_1","VALUE_1") .addHeader("NAME_2","VALUE_2") .addHeader("NAME_3","VALUE_3") .build();