本節我們來講解OkHtpp網路請求框架
在我的理解中,網路請求框架是為了方便我們更加便捷規範的進行網路請求所建的類,我們通過呼叫該類中的方法可以快速地進行網路請求,切幫我們封裝好了一些資料的處理方法,方便我們用更少的程式碼去做更多的事。
在android開發中,除了java原生的HttpURLConnection,常見的網路請求框架有
OkHttp
Volley
Retrofit
HttpClient
這其中最好用的莫過於Retrofit了,但是Retrofit是在OkHttp基礎上再次進行封裝的,所以我們先了解OkHttp網路請求,這對於我們日後的安卓開發也是有著很大的幫助。
在專案檔案下build.gradle(app)的dependencies中匯入所需要的庫
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.12.0'
這裡我們使用3.12.0版本,如果需要使用其他版本,修改version版本號為自己想要的版本。
public static String get(String src){
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
// 構建request請求
Request request = new Request.Builder()
.url(src)
.get()
.build();
// 傳送請求獲取返回資料
Call call = okHttpClient.newCall(request);
// 獲取響應體
ResponseBody body = null;
String string = null;
try {
body = call.execute().body();
// 轉換成string
string = body.string();
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
可以看出這些程式碼對比起java原生的HttpURLConnection請求來說,簡短了很多,不再需要設定一些超時,IO流之類的操著,那麼因為OkHttp封裝時給定了預設值,這樣就大大減少了我們的工作量,我們現在只需要傳送請求獲取響應資料就行了。
public static String post(String src,String json){
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
// 構建請求體
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),json);
// 構建request請求
Request request = new Request.Builder()
.post(requestBody)
.url(src)
.build();
// 傳送請求獲取返回資料
Call call = okHttpClient.newCall(request);
// 獲取響應體
ResponseBody body = null;
String string = null;
try {
body = call.execute().body();
// 轉換成string
string = body.string();
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
可以看出,這裡我們只是修改了.get為.post並且傳入了請求體,等於只需要新構建一個請求體,將我們的要向伺服器端傳送的資料加入其中即可,這裡我們使用的時application/json的方式,其他方式在第二篇提過一下,感興趣的可以自己查閱資料。
put請求就更簡單了,在原post請求中修改.post為.put即可,沒有任何難度
public static String put(String src,String json){
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
// 構建請求體
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),json);
// 構建request請求
Request request = new Request.Builder()
.url(src)
.put(requestBody)
.build();
// 傳送請求獲取返回資料
Call call = okHttpClient.newCall(request);
// 獲取響應體
ResponseBody body = null;
String string = null;
try {
body = call.execute().body();
// 轉換成string
string = body.string();
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
delete請求有兩種不同的方式:攜帶引數與不攜帶引數。
攜帶引數:攜帶引數實在原post請求中將.post修改為.delete,一樣的傳入一個請求體即可
public static String delete(String src,String json){
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
// 構建請求體
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),json);
// 構建request請求
Request request = new Request.Builder()
.url(src)
.delete(requestBody)
.build();
// 傳送請求獲取返回資料
Call call = okHttpClient.newCall(request);
// 獲取響應體
ResponseBody body = null;
String string = null;
try {
body = call.execute().body();
// 轉換成string
string = body.string();
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
不攜帶引數則時在get請求上重寫,將.get修改為.delete即可
public static String delete(String src){
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
// 構建request請求
Request request = new Request.Builder()
.url(src)
.delete()
.build();
// 傳送請求獲取返回資料
Call call = okHttpClient.newCall(request);
// 獲取響應體
ResponseBody body = null;
String string = null;
try {
body = call.execute().body();
// 轉換成string
string = body.string();
} catch (IOException e) {
e.printStackTrace();
}
return string;
}
相信經歷過HttpURLConnection那複雜的網路請求設定後,OkHttp框架將會讓你更加快樂的進行網路開發。
上面我們說過,OkHttp預設幫我們設定好了設定,那麼我們不想使用預設設定該怎麼辦呢。
我們可以在建立OkHttpClient類的時候使用鏈式呼叫的方式來設定預設的引數,如
// 範例化OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient.Builder()
// 一天
.connectTimeout(Duration.ofDays(1))
// 系統預設dns
.dns(Dns.SYSTEM)
.build();