retrofit筆記一:發送get和post請求

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章