關於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註解。
@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請求,其提供非常多的註解來給開發者使用,簡化了程式碼。