Android框架式編程之Retrofit


一、Retrofit 簡介

Retrofit 官網地址: https://github.com/square/retrofit

Retrofit(即Retrofit,目前最新版本為2.6.0版本),是目前非常流行的網絡請求框架,底層是基於okHttp實現的。准確來說Retrofit是對okHttp的進一步封裝,它功能強大,支持同步和異步,支持多種數據的解析方式(默認為Gson),支持RxJava。

Retrofit 最大的優勢就是簡潔易用,它通過注解配置網絡請求的參數,采用大量的設計模式來簡化我們的使用。而且它的拓展性也做的相當的好,Retrofit 的功能模塊高度封裝,高內聚低耦合,我們可以自定義自己想要的組件,比如說我們可以自己選擇解析工具而不用默認的Gson。除此之外,Retrofit 還有諸如性能好,處理速度快,代碼簡化等優勢。

二、Retrofit 注解

 使用 Retrofit 前我們不得不提一下注解,正是這些注解極大的方便了我們的代碼編寫及邏輯流程的控制。

1. 請求方法注解

  • @GET:GET請求
  • @POST:POST請求
  • @DELETE:DELETE請求
  • @HEAD:HEAD請求
  • @OPTIONS:OPTIONS請求
  • @PATCH:PATCH請求

2. 請求參數

  • @Headers:添加請求頭
  • @Path:替換路徑
  • @Query:替代參數值,通常是結合get請求的
  • @FormUrlEncoded:用表單數據提交
  • @Field:替換參數值,是結合post請求的

二、Retrofit 使用

Retrofit代碼實現步驟如下:

1)創建Retrofit 實例。

2)定義接口,使用注解的形式封裝請求地址和請求參數

3)通過Retrofit實例,獲取一個接口服務對象

4)通過接口服務對象調用接口中的方法,獲取call對象

5)Call對象執行請求(異步請求、同步請求)

0. 准備工作

由於Retrofit是基於OkHttp,所以還需要添加OkHttp庫依賴,需要在build.grale添加如下依賴:

dependencies {
    // Okhttp庫
    compile 'com.squareup.okhttp3:okhttp:3.10.0'
    // Retrofit庫
    compile 'com.squareup.retrofit2:retrofit:2.6.0'
}

添加網絡權限

<uses-permission android:name="android.permission.INTERNET"/>

創建接收服務器返回數據的類:

public class Blog {
    // 根據返回數據的格式和數據解析方式(Json、XML等)定義
    ...
}

1. 創建Retrofit實例

創建Retrofit實例時需要通過 Retrofit.Builder,並調用baseUrl方法設置URL。

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://localhost:4567/")
        .build();

注意:Retrofit 的 baseUlr 必須以 /(斜線) 結束,不然會拋出一個IllegalArgumentException。

2. 定義接口

定義請求接口的方式示例如下:

public interface BlogService {
    @GET("blog/{id}")
    Call<ResponseBody> getBlog(@Path("id") int id);
}

注意這里的 interface不是class,所以我們是無法直接調用該方法,我們需要用Retrofit創建一個BlogService的代理對象。

BlogService service = retrofit.create(BlogService.class);

拿到代理對象之后,就可以調用了。

3. 接口調用

調用方式的示例如下:

Call<ResponseBody> call = service.getBlog(2);
// 通過call對象執行網絡請求(同步請求execute,異步請求enqueue)
call.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
        t.printStackTrace();
    }
});

至此,使用Retrofit 就能夠進行基本的網絡請求了,如果需要更深層的使用,可以參考一下資料進行使用,后續我們在對這些高級的使用方法進行一一整理。

三、Retrofit 添加header參數

添加Header有以下幾種方式:

1. 使用注解的方式

添加一個Header參數

public interface UserService { 
    @Headers("Cache-Control: max-age=640000")
    @GET("/tasks")
    Call<List<Task>> getTasks();
}

添加多個Header參數

public interface UserService { 
  @Headers({
    "Accept: application/vnd.yourapi.v1.full+json",
    "User-Agent: Your-App-Name"
  })
  @GET("/tasks/{task_id}")
  Call<Task> getTask(@Path("task_id") long taskId);
}

2. 使用代碼的方式,則需要使用攔截器:

OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); 
httpClient.addInterceptor(new Interceptor() { 
  @Override
  public Response intercept(Interceptor.Chain chain) throws IOException {
  Request original = chain.request();
  Request request = original.newBuilder().header("User-Agent", "Your-App-Name")
       .header("Accept", "application/vnd.yourapi.v1.full+json")
       .method(original.method(), original.body()).build();
  return chain.proceed(request);
  }
}

OkHttpClient client = httpClient.build(); 
Retrofit retrofit = new Retrofit.Builder().baseUrl(API_BASE_URL)
.addConverterFactory(GsonConverterFactory.create()).client(client).build();

3. 使用注解的方式,但是Header參數每次提交的都不同,也就是動態的Header:

public interface UserService { 
@GET("/tasks")
Call<List<Task>> getTasks(@Header("Content-Range") String contentRange);
}

4. 使用注解Map方式,也就是將多個Header參數進行封裝:

@GET("/search")
Call<ResponseBody> list(@HeaderMap Map<String, String> headers);

四、Retrofit 提交數據方式

1. Retrofit實現Form提交

 Form表單提交,后台服務器是以 鍵值對 的形式來接受參數的,所以Retrofit也很聰明,把接口參數通過Map的形式來提交。使用@FieldMap,@POST注解。

    /**
     * 登錄
     * post
     * 表單提交
     *
     * @param map
     * @return
     */
    @FormUrlEncoded
    @POST("login")
    Flowable<BaseDto<LoginDto>> login(@FieldMap Map<String, String> map);

2. Retrofit實現Json提交

Json提交就是可以把對象直接轉換成Json字符串,提交到后台服務器。所以我們直接傳遞整個對象即可。Retrofit會幫我們把對象轉換成Json,然后傳遞給后台服務器。使用@Body ,@POST注解。

    /**
     * 簽到詳情
     *
     * @param vo
     * @return
     */
    @POST("sign/getDate")
    Flowable<BaseDto<SignDetailDto>> signGetDate(@Body SignDetailVo vo);

 

參考資料:

1. 博文:https://www.jianshu.com/p/308f3c54abdd  

2. 實例代碼:https://github.com/ikidou/Retrofit2Demo/tree/master/client/src/main/java/com/github/ikidou

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM