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