使用OkHttp的那些事兒(一)
阿新 • • 發佈:2019-01-03
OkHttp作為目前相當流行的網路請求框架,已經被Google官方認定,而且Google在官方的應用程式中也已經大量的使用。
網路上不乏大量有關於OkHttp的教程,本人才疏學淺,只得將OkHttp的基本使用方式在下面做一個整理。
這裡使用
https://api.douban.com/v2/book/search?q=金瓶梅&tag=&start=0&count=1
作為介面呼叫API。
首先在AS中新增依賴:
compile 'com.squareup.okhttp3:okhttp:3.6.0'
注意在清單檔案中加入網路請求的許可權。
GET請求的基本流程:
//首先建立請求的客戶端物件
OkHttpClient client=new OkHttpClient();
//使用Request.Builder來建立請求物件
Request.Builder builder=new Request.Builder();
//指定使用GET請求,並且指定要請求的地址
Request request=builder.get().url("https://api.douban.com/v2/book/search?q=金瓶梅&tag=&start=0&count=1").build();
//將請求加入請求佇列,將請求封裝成Call物件
Call call=client.newCall(request);
//使用非同步的方式來得到請求的響應並且處理
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//請求失敗
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
//請求成功
//此處非UI執行緒
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),response.body().toString(),Toast.LENGTH_SHORT).show();
}
});
}
});
上面是非同步的請求URL然後得到響應,當然也可以同步的請求網路:
//將請求加入請求佇列,將請求封裝成Call物件
Call call=client.newCall(request);
//使用同步的方式來得到響應
new Thread(){
@Override
public void run() {
super.run();
try {
final Response response=call.execute();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
OK,上面的兩種方式就是GET請求的基本流程.這裡我們可以看到,無論通過哪一種網路請求方式,我們得到的最終結果就是Response這個響應物件,我們所請求的結果也都封裝在這個Response物件中。
我們通過response.isSuccessful()
來判斷得到的響應是否成功;
我們通過response.body()
來得到成功響應時候的響應體,
response.body().string(); //將響應的結果以字串的形式返回
response.body().bytes(); //將響應的結果以位元組陣列的形式返回
response.body().byteStream(); //將響應的結果以位元組流的形式返回
response.body().contentLength(); //得到響應內容的長度
除此之外,我們可以使用response.close();
來關閉響應釋放資源的等等。
POST請求的基本流程:
OkHttpClient client=new OkHttpClient();
Request.Builder builder=new Request.Builder();
//post請求傳遞引數首先需要建立請求體:
RequestBody requestBody=new FormBody.Builder().add("key1","value1")
.add("key2","value2")
.add("key3","value3")
.add("key4","value4")
.build();
Request request=builder.post(requestBody).url("xxxURL地址").build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Toast.makeText(getApplicationContext(),response.body().string().toString(),Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
});
由於POST請求時,引數是封裝在請求體中的,因此這裡我們使用RequestBody來封裝請求引數。