Android Retrofit的使用

鋸齒流沙發表於2018-01-01

關於Retrofit的學習,我算是比較晚的了,而現在Retrofit已經是Android非常流行的網路請求框架了。之前,我沒有學過Retrofit,但最近公司的新專案使用了Retrofit、Rxjava和OkHttp來進行封裝,使用起來非常簡便,增加程式碼的美觀程度,也降低了耦合度,這是一個非常棒的框架,特別是這三者一起使用。

簡介

Retrofit是Square公司開發的一款針對Android網路請求的框架,現在已經更新到2.3版本了。Retrofit的最大特點是使用執行時註解的方式提供功能。

Retrofit的使用

關於Retrofit的使用,其實還是很簡單的,而且邏輯思路也比較清晰,所以開發者是很容易上手的。

新增依賴

build.gradle檔案的dependencies下新增以下依賴:

compile 'com.squareup.retrofit2:retrofit:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.3.0'

上面除了新增Retrofit依賴,還新增了gson依賴,來解析請求得到的json資料。

定義使用的資料集合
class Result <T>{
    var status: Int? = -1//請求結果
    lateinit var message: String;
    var content :T?= null
}
複製程式碼

這是返回結果的集合,使用了kotlin來寫

class Content {
    var name: String?= null
    var mobile :String?= null
    var address :String?= null
}
複製程式碼

需要的內容集合類

請求

需要一個介面,並且編寫請求的方法

interface HttpService {
    @GET("index.php?m=Api&c=User&a=userInfo")
    fun getUserInfo(): Call<Result<Content>>
}
複製程式碼

呼叫請求

    private void request() {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://one.sinalwj.cn//")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        HttpService service = retrofit.create(HttpService.class);
        Call<Result<Content>> call = service.getUserInfo();
        call.enqueue(new Callback<Result<Content>>() {
            @Override
            public void onResponse(Call<Result<Content>> call, Response<Result<Content>> response) {
                Log.i("tag", response.body().getContent().getName());
            }
            @Override
            public void onFailure(Call<Result<Content>> call, Throwable t) {
                Log.i("tag", "失敗");
            }
        });

    }
複製程式碼

以上就是Retrofit的get請求方式。GET請求需要在請求方法之前新增一個GET註解來標明這是一個GET請求,同樣,如果是POST請求需要一個POST註解。

Retrofix

@POST

POST請求,需要新增一個@POST的註解,並且需要還需要使用@FormUrlEncoded 註解來表明,這是一個表單,使用@Field註解,傳入表單需要的引數。

    @FormUrlEncoded //表單
    @POST("index.php?m=Api&c=User&a=userInfo")
    fun getUserInfo(
            @Field("user_id") user_id: String //引數
    ): Observable<BaseResult<User>> //返回資料型別
複製程式碼
@Body

@Body註解是針對POST的請求方式,如傳輸資料JSON格式

class Content {
    var name: String?= null
    lateinit var sn:SN

    class SN{
        var out :String ?= null
        var errNo :Int ?= -1
    }
}
複製程式碼
 @GET("ajax.php")
fun getInfo(@Body content: Content): Call<Result<Content>>
複製程式碼
@Path

使用@Path可以動態的配置URL地址。

@GET("{path/}{index.php?m=Api&c=User&a=userInfo")
fun getUserInfo(@Path("path")path: String): Call<Result<Content>>
複製程式碼
@Query

@Query即動態指定查詢條件

@GET("ajax.php")
fun getInfo(@Query("id")id: String): Call<Result<Content>>
複製程式碼

@Query是查詢單一的條件,但是如果是多個條件的話,就不適用了,那麼就需要用到@QueryMap註解。@QueryMap就是動態指定查詢條件組。

檔案上傳

使用@Part註解來表示單個檔案上傳,而@PartMap註解跟單檔案上傳是類似的,是不過是使用了Map集合來封裝了上傳的檔案,即多檔案上傳。

除了以上的註解,還有@Header,即表示加入訊息報頭,因為在http請求的時候,為了防止攻擊、過濾不安全的訪問和新增特殊加密的訪問來保證安全,需要在訊息報頭中攜帶一些特殊的訊息處理,而在Retrofix中使用@Header即可實現新增訊息報頭。

從上面的Retrofix實踐和註解的講解中,我們知道使用Retrofix可以很簡單的,而且程式碼邏輯比較清晰的做http請求,其提供非常多的註解來給開發者使用,簡化了程式碼。

參考文章

《用 Retrofit 2 簡化 HTTP 請求》

相關文章