關於Retrofit的學習,我算是比較晚的了,而如今Retrofit已是Android很是流行的網絡請求框架了。以前,我沒有學過Retrofit,但最近公司的新項目使用了Retrofit、Rxjava和OkHttp來進行封裝,使用起來很是簡便,增長代碼的美觀程度,也下降了耦合度,這是一個很是棒的框架,特別是這三者一塊兒使用。php
Retrofit是Square公司開發的一款針對Android網絡請求的框架,如今已經更新到2.3版本了。Retrofit的最大特色是使用運行時註解的方式提供功能。java
關於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註解。
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註解是針對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能夠動態的配置URL地址。
@GET("{path/}{index.php?m=Api&c=User&a=userInfo")
fun getUserInfo(@Path("path")path: String): Call<Result<Content>>
複製代碼
@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請求,其提供很是多的註解來給開發者使用,簡化了代碼。