Android網路請求(終) 網路請求框架Retrofit

2022-11-24 06:01:11

Android網路請求(終) 網路請求框架Retrofit

Retrofit底層是由OkHttp封裝的,Retrofit對於註解的使用十分頻繁,所以不瞭解註解的同學們可以去查查資料什麼的。

這裡有一個小細節,要使用Retrofit至少需要jdk1.8以上和Android API 21以上

Android架構中的MVVM所普遍使用的網路請求框架就是Retrofit。

我們說了,註解的使用很平凡,那麼我們來看看Retrofit的註解有哪些吧。

註解

註解 含義
@GET 通過GET方式請求
@POST 通過POST方式請求
@DELETE 通過DELETE方式請求
@PUT 通過PUT方式請求
@HEAD 通過HEAD方式請求
@OPTIONS 通過OPTIONS方式請求
@PATCH 通過PATCH方式請求

以上的都是請求方式。這裡就知道了我們並不是只能有四種請求方式的。

還有一些對這個請求進行標註的註解。

註解 含義
@Headers 給請求新增請求頭
@Path 用於restful風格的請求替換其中的路徑
@Query 用於標註請求的引數,一般get請求
@FormUrlEncoded 表示這個請求以表單的方式提交
@Field 用於標註請求的引數,一般post請求
@Body 用於標註請求的引數,一般是一個請求體,可以上傳檔案或者是一個類

上面的就是Retrofit常用註解了。

Retrofit的使用

匯入依賴

這裡要匯入兩個依賴包,分別是retrofit2和gson的。因為retrofit2支援直接將獲取到的資料轉換成實體類物件,方便我們使用。

在專案檔案下build.gradle(app)的dependencies中匯入所需要的庫

implementation group: 'com.squareup.retrofit2', name: 'retrofit', version: '2.6.3'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.0'

網路請求

我們先新建一個網路請求類,在其中範例化retrofit。

//    請求地址
    public static String IP = "http://www.baidu.com";
//    範例化Retrofit
    private static Retrofit retrofit = new Retrofit.Builder()
//        設定Retrofit的基礎網路地址
            .baseUrl(IP)
//        新增gson範例化工廠
            .addConverterFactory(GsonConverterFactory.create())
            .build();

設定了baseUrl(IP),之後通過該物件發起的網路請求中預設在你的請求連線地址前加上IP。

新建一個介面,用於存放網路請求的各個地址

public interface Link {
    @GET("/s?wd=堅定不移推動構建亞太命運共同體")
    Call<String> getBaiDu();
}

在我們的網路請求類中建立一個可以存取到該介面的方法。

public static Link getLink(){
    return retrofit.create(Link.class);
}

這裡使用的都是公開靜態方法和變數,是為了在其他類中更加方便的使用網路請求類。

在MainActivity中去呼叫它

Net.getLink().getBaiDu().enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                String body = response.body();
                System.out.println(body);
            }

            @Override
            public void onFailure(Call<String> call, Throwable throwable) {

            }
        });

這短程式碼中只需要你通過網路請求類Net存取Link結構getLink(),呼叫請求方法getBaiDu();我們會通過get方法去存取如下地址

http://www.baidu.com/s?wd=堅定不移推動構建亞太命運共同體

這其實就是將baseUrl和@GET中的地址拼接起來了。最基本的使用就是這麼簡單。

當然了,如果我們想將搜尋的值設定為一個由使用者輸入的變數,我們修改getBaiDu方法

    @GET("/s")
    Call<String> getBaiDu(@Query("wd") String value);

那麼在呼叫時可以作為一個引數傳入到該請求中,如

Net.getLink().getBaiDu("堅定不移推動構建亞太命運共同體").enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                String body = response.body();
                System.out.println(body);
            }

            @Override
            public void onFailure(Call<String> call, Throwable throwable) {

            }
        });

如果我們的引數是restful風格的,那麼我們需要修改以下傳遞的引數,比如/s就是restful風格,我們就這麼改

@GET("/{path}")
Call<String> getBaiDu(@Path("path") String path,@Query("wd") String value);

那麼我們在呼叫時只需要全部以引數的形式傳遞即可

Net.getLink().getBaiDu("s","堅定不移推動構建亞太命運共同體").enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, Response<String> response) {
                String body = response.body();
                System.out.println(body);
            }

            @Override
            public void onFailure(Call<String> call, Throwable throwable) {

            }
        });

這些效果都是一樣的。

如果你需要傳入請求頭,那麼就多加一個引數,如

    @Headers({
            "Accept: application/json",
            "User-Agent: Retrofit-Sample-App"
    })
    @GET("/{path}")
    Call<String> getBaiDu(@Path("path") String path,@Query("wd") String value);

說明

以上註解都是可以用的,如你想post請求那麼使用@POST,效果都是一樣的。靈活切換,多嘗試。Restful的特點就是對開發者特別友好效能好,處理快,使用簡單使用REST API非常方便支援NIO(新的IO API,可以替代標準的Java IO API)預設使用Gson解析

想要了解更多的可以去搜一搜這些註解,使用方式就是這麼簡單,也沒多複雜。

可以和LiveData、ViewModle、Rxjava構建MVVM專案結構

網路請求總結

網路請求就到這裡了,基本上這些網路框架就是我們日常開發中的全部了,至於HttpClient,它的使用不比java原生的HttpURLConnection方便到哪裡去,我就不講了,同樣感興趣的可以去自行查閱資料。