android Retrofit網絡框架(一)之Retrofit詳解

.

一、前言

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();

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章