.
一、前言
Retrofit 是一個 RESTful 的 HTTP 網絡請求框架的封裝,底層是OKHttp,可以處理GET、POST、PUT、DELETE等請求,還可以使用Picasso加載圖片。
二、註解
1.網絡請求方法
@POST、@GET、@PUT、@DELETE全都是http中網絡請求方式,@HTTP可以替換@POST、@GET、@PUT、@DELETE註解及更多功能,具體使用如下:
public interface RerofitService{
/**
*method:網絡請求方法
*path:網絡請求地址
*hasBody:是否有請求體
*/
@HTTP(method="POST", path="blog/", hasBody= false)
Call<ResponseBody> getUserInfo(@Path("id") int id);
}
2.標記類
@FormUrlEncoded:表示發送form-encoded表單數據,每個鍵值需要用 @Field來註釋key名,隨後的對象需要提供值,即value,如果多個鍵值對用註解@FieldMap。(@FormUrlEncoded和@Field或和@FieldMap成對出現,即配合使用)
如:登錄頁面使用:Content-Type:application/x-www-form-urlencoded。
@Multipart:表示發送form-encoded表單數據,適用於文件上傳,每個鍵值需用@Part註解註釋key名,隨後對象提供鍵值value,多個文件上傳用註解@PartMap。(@Multipart與@Part或@PartMap配合使用)
如:上傳文件使用:Content-Type:multipart/form-data。
@Screaming:表示返回數據以流的形式返回,適用於返回數據較大的場景。如果微使用該註解,默認會把數據全部載入內存,之後取數據從內存中獲取。
3.網絡請求參數
@Headers:添加請求頭,請求頭固定,請求頭不會相互覆蓋
public interface RetrofitService{
/**
*content-type: 傳輸數據類型爲json
*/
@Headers("Content-type: application/json")
@POST("blog/")
Call<ResponseBody> getUserInfo();
/**
*Content-type: 請求數據類型爲json
*Accept:接收數據類型爲json
*Connection:網絡連接類型,keep-alive爲長鏈接,close爲短鏈接
*/
@Headers({"Content-type: application/json", "Accept: application/json", "Connection: keep-alive"})
@POST("blog/")
Call<ResponseBody> getUserInfo();
}
@Header:動態更新請求頭,匹配的參數必須提供給 @Header ,若參數值爲 null ,這個頭會被省略,否則,會使用參數值的 toString 方法的返回值。
public interface RetrofitService{
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@Header("Authorization") String authorization);
}
@Path:用於替換Url中地址缺省值
public interface RetrofitService{
@POST("user/{id}")
Call<ResponseBody> getUserInfo(@Path("id") String id);
}
@Url:用於請求地址url設置
public interface RetrofitService{
@POST
Call<ResponseBody> getUserInfo(@Url String url);
}
@Body:用於post請求發送非表單數據,會把我們傳入的實體類轉換爲用於傳輸的HTTP請求體
public interface RetrofitService{
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@Body User user);
}
@Query & @QueryMap:用於在url後拼接上參數
@GET("book/search")
Call<Book> getSearchBook(@Query("q") String name);//name由調用者傳入
相當於:
@GET("book/search?q=name")
Call<Book> getSearchBook();
@Field & FieldMap:發送 Post請求 時提交請求的表單字段,與 @FormUrlEncoded 註解配合使用
public interface RetrofitService{
@FormUrlEncoded
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@Field("name") String name, @Field("idCard") String idCard);
@FormUrlEncoded
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@FieldMap Map<String, String> userMap);
}
@Part & @PartMap:發送 Post請求 時提交請求的表單字段,與 @Multipart 註解配合使用,適用於上傳文件
public interface RetrofitService{
/**
*Part後面支持三種類型,RequestBody、okhttp3.MultipartBody.Part、任意類型
* 除okhttp3.MultipartBody.Part 以外,其它類型都必須帶上表單字段中已經包含了表單字段的信息
*/
@Multipart
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@Part("name") RequestBody name, @Part MultipartBody.part file);
/**
*PartMap 註解支持一個Map作爲參數,支持 {@link RequestBody } 類型,
* 如果有其它的類型,會被retrofit2.Converter轉換,
*/
@Multipart
@POST("user/getUser")
Call<ResponseBody> getUserInfo(@PartMap Map<String, String> userMap);
}
三、創建Retrofit發送網絡請求
1.創建retrofit
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())//json轉換器
.baseUrl("https://api.douban.com/v2/")
.build();
2.定義Http Api請求接口
public interface RetrofitService{
@POST("book/search")
Call<Book> getBookInfo(@Query("name") String name);
}
3.創建請求接口實例
RetrofitService retrofirService = retrofit.create(RetrofitService.class);
4.用接口實例創建請求
Call<Book> call = retrofirService.getBookInfo("目送");
5.發送請求
- 異步請求
call.enqueue(new Callback<Book>() {
@Override
public void onResponse(Call<Book> call, Response<Book> response) {
}
@Override
public void onFailure(Call<Book> call, Throwable t) {
//如果設置了重試,但有些接口不需要重試
call.cancel();
}
});
- 同步請求
Response<Book> response = call.excute();