Android Retrofit的使用

關於Retrofit的學習,我算是比較晚的了,而如今Retrofit已是Android很是流行的網絡請求框架了。以前,我沒有學過Retrofit,但最近公司的新項目使用了Retrofit、Rxjava和OkHttp來進行封裝,使用起來很是簡便,增長代碼的美觀程度,也下降了耦合度,這是一個很是棒的框架,特別是這三者一塊兒使用。php

簡介

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

Retrofit的使用

關於Retrofit的使用,其實仍是很簡單的,並且邏輯思路也比較清晰,因此開發者是很容易上手的。git

添加依賴

build.gradle文件的dependencies下添加如下依賴:github

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

上面除了添加Retrofit依賴,還添加了gson依賴,來解析請求獲得的json數據。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
}
複製代碼

須要的內容集合類bash

請求

須要一個接口,而且編寫請求的方法網絡

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 請求》

相關文章
相關標籤/搜索