Retrofit是一个网络操作接口框架,底部真正进行网络请求实现的是OkHttp。
Retrofit使用步骤:
1、定义一个接口 public interface HttpService { /** * 定义请求方法 */ @GET("/") CallgetRequestNoParams(); } 2、构建接口对象(动态代理构建我们定义接口的对象) Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://square.github.io/") .build(); HttpService httpService = retrofit.create(HttpService.class); 3、发送请求 Call call = httpService.getRequestNoParams(); call.enqueue(xx)//异步请求,接口回调在子线程 call.execute()//同步请求
//1、构建Retrofit Retrofit.Builder builder = new Retrofit.Builder(); builder.baseUrl("https://www.baidu.com/"); Retrofit retrofit = builder.build(); //2、定义接口 public interface HttpService { /*** * 直接访问,不带任何参数,此处注解@GET必须加一个“/”,否则会报错 */ @GET("/") CallgetRequest(); /** * 希望动态修改url路径使用@Path注解,希望动态修改的参数用{}进行标记 * 如本例{id},@Path注解中value=“id” */ @GET("/{id}/user") Call getRequest(@Path(value = "id", encoded = true) String id); /** * 添加静态的头使用@Headers注解,格式如例子“key:value” */ @GET("/id/user") @Headers({ "a:1", "b:2", }) Call getRequest(); /** * 动态添加头使用@Header或HeaderMap注解,一个是添加一个一个是添加一组, * 注解中填入的key1就是key,参数String value就是对于的值 * 注意此处静态头中也定义了key1,动态头key1不会覆盖静态头,两个都会存在, * 最终的结果就是 * * key1:value1 * key2:value2 * key1:value *
* * @return */ @GET("/id/user") @Headers({ "key1:value1", "key2:value2" }) CallgetRequest(@Header("key1") String value, @HeaderMap Map headerMap); /** * 携带url请求参数使用@Query或者@QueryMap * # @Query是添加一个请求参数如本例子 key = key,value = value * # @QueryMap 是添加很多的参数,以map的形式提供 * 最终请求结果就是: * xxxx/id/user?key1=value1&key2=value2 */ @GET("/id/user") Call getRequest(@Query(value = "key", encoded = true) String value, @QueryMap(encoded = true) Map queryMap); /** * Get请求综合操作 */ @GET("/{id}/user") @Headers({ "key1:value1", "key2:value2" }) Call getRequest(@Path(value = "id",encoded = true) String id, @HeaderMap Map headMap, @QueryMap(encoded = true) Map queryMap); } //3、发送请求 HttpService httpService = retrofit.create(HttpService.class); Call call = httpService.getRequestNoParams(); call.enqueue(new Callback () {//发送异步请求 @Override public void onResponse(Call call, Response response) { } @Override public void onFailure(Call call, Throwable t) { } }); //Response execute = requestWithParams.execute();;//发送同步请求
只给出接口了,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); }