Retrofit是一個網絡操作接口框架,底部真正進行網絡請求實現的是OkHttp。
Retrofit使用步驟:
1、定義一個接口
public interface HttpService {
/**
* 定義請求方法
*/
@GET("/")
Call<ResponseBody> getRequestNoParams();
}
2、構建接口對象(動態代理構建我們定義接口的對象)
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://square.github.io/")
.build();
HttpService httpService = retrofit.create(HttpService.class);
3、發送請求
Call<ResponseBody> call = httpService.getRequestNoParams();
call.enqueue(xx)//異步請求,接口回調在子線程
call.execute()//同步請求
發送get請求示例
//1、構建Retrofit
Retrofit.Builder builder = new Retrofit.Builder();
builder.baseUrl("https://www.baidu.com/");
Retrofit retrofit = builder.build();
//2、定義接口
public interface HttpService {
/***
* 直接訪問,不帶任何參數,此處註解@GET必須加一個“/”,否則會報錯
*/
@GET("/")
Call<ResponseBody> getRequest();
/**
* 希望動態修改url路徑使用@Path註解,希望動態修改的參數用{}進行標記
* 如本例{id},@Path註解中value=“id”
*/
@GET("/{id}/user")
Call<ResponseBody> getRequest(@Path(value = "id", encoded = true) String id);
/**
* 添加靜態的頭使用@Headers註解,格式如例子“key:value”
*/
@GET("/id/user")
@Headers({
"a:1",
"b:2",
})
Call<ResponseBody> getRequest();
/**
* 動態添加頭使用@Header或HeaderMap註解,一個是添加一個一個是添加一組,
* 註解中填入的key1就是key,參數String value就是對於的值
* 注意此處靜態頭中也定義了key1,動態頭key1不會覆蓋靜態頭,兩個都會存在,
* 最終的結果就是
* <p>
* key1:value1
* key2:value2
* key1:value
* </p>
*
* @return
*/
@GET("/id/user")
@Headers({
"key1:value1",
"key2:value2"
})
Call<ResponseBody> getRequest(@Header("key1") String value, @HeaderMap Map<String, String> headerMap);
/**
* 攜帶url請求參數使用@Query或者@QueryMap
* # @Query是添加一個請求參數如本例子 key = key,value = value
* # @QueryMap 是添加很多的參數,以map的形式提供
* 最終請求結果就是:
* xxxx/id/user?key1=value1&key2=value2
*/
@GET("/id/user")
Call<ResponseBody> getRequest(@Query(value = "key", encoded = true) String value, @QueryMap(encoded = true) Map<String, String> queryMap);
/**
* Get請求綜合操作
*/
@GET("/{id}/user")
@Headers({
"key1:value1",
"key2:value2"
})
Call<ResponseBody> getRequest(@Path(value = "id",encoded = true) String id, @HeaderMap Map<String, String> headMap, @QueryMap(encoded = true) Map<String, String> queryMap);
}
//3、發送請求
HttpService httpService = retrofit.create(HttpService.class);
Call<ResponseBody> call = httpService.getRequestNoParams();
call.enqueue(new Callback<ResponseBody>() {//發送異步請求
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
//Response<ResponseBody> execute = requestWithParams.execute();;//發送同步請求
發送Post請求示例
只給出接口了,Post和Get請求的區別就是Post可以攜帶請求體,其他和Get基本是一樣的,所以上面的註解也同樣適用於Post請求。下面示例Post的請求示例
public interface HttpService{
/**
* 發送表單形式的請求體
* 使用@Field(添加一個)或者@FieldMap(添加多個)註解添加表單形式的請求體,
* 必須要和@FormUrlEncoded註解一起使用否則會報錯
* <p>
* #@Field或@FieldMap註解添加的參數會以 key1=value1&key2=value2&key3=value3
* 的格式在post的請求體中存在
* <p/>
*/
@POST("/")
@FormUrlEncoded
Call<ResponseBody> postRequest(@Field("a") String a, @FieldMap(encoded = true) Map<String, String> fieldMap);
/**
* 發送Json格式的請求體(需要藉助Gson)
* 使用@Body註解,比如User類,如果是JSON格式 retrofit 必須指定converter
* <p>
* retrofit支持Gson, 所以可以使用,將對象映射成json格式
* builder.baseUrl("http://square.github.io/")
* .addConverterFactory(GsonConverterFactory.create());
*/
@POST("/")
Call<ResponseBody> postRequestWithBody(@Body User user);
}