1. 程式人生 > >使用OkHttp的那些事兒(一)

使用OkHttp的那些事兒(一)

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來封裝請求引數。