Android網路請求(終) 網路請求框架Retrofit Retrofit底層是由OkHttp封裝的,Retrofit對於註解的使用十分頻繁,所以不瞭解註解的同學們可以去查查資料什麼的。 這裡有一個小細節,要使用Retrofit至少需要jdk1.8以上和Android API 21以上 Andro ...
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方便到哪裡去,我就不講了,同樣感興趣的可以去自行查閱資料。