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);
}

猜你喜欢

转载自blog.csdn.net/txksnail/article/details/81008109