Android-MVVM之快速上手Retrofit
什么是Retrofit?
发请求用的,底层封装了okHttp
直接上代码
// Get请求
public interface Api {
@GET("user")
Call<ResponseBody> getData(@Query("id") int id);
}
// 需要注意的点:
// 1 @GET注解,即get请求
// 2 Call<ResponseBody> 是返回类型,ResponseBody是自己定义的实体类。
// 3 @Query 代码拼在URL后面的参数
// GET请求需要多个参数怎么办?
public interface Api {
@GET("user")
Call<ResponseBody> getData(@QueryMap Map<String, String> map);
}
// 1.使用@QueryMap,可以传递多个参数。
Map<String, String> map = new HashMap<>();
map.put("id", 1);
map.put("name", "flx");
// POST 请求---表单提交
@FormUrlEncoded
@POST("user")
Call<ResponseBody> getData(@Field("id") String id);
// 1 @FormUrlEncoded:需要表单方式提交的时候使用这个注解
// POST 请求---表单提交,需要提交多个参数的时候怎么办
@FormUrlEncoded
@POST("user")
Call<ResponseBody> getData(@FieldMap("id") Map<String, String> map);
// 1.使用@FieldMap,可以传递多个参数。
Map<String, String> map = new HashMap<>();
map.put("id", 1);
map.put("name", "flx");
// POST 请求---json提交
@POST("user")
Call<ResponseBody> getData(@Body RequestBody body);
// 切记:@Body注解不能与@FormUrlEncoded和@Multipart注解(后面说)同时使用
// 文件上传
@Multipart
@POST("user")
Call<ResponseBody> getData(@Part("name") RequestBody name, @Part MultipartBody.Part file);
// 1 @Multipart注解:代表可以使用文件上传。
// 2 @Part用于表单字段,适用于文件上传的情况。
// 3 @Part MultipartBody.Part(),需要三个参数。第一个参数:上传文件的key;第二个参数:文件名;第三个参数:RequestBody对象。
// 注意:文件对象的格式。MediaType.parse("image/png") 及MediaType.parse("multipart/form-data")等等。
String name = "ABC"
RequestBody imgBody = RequestBody.create(MediaType.parse("image/png"), file);
//将文件转化为MultipartBody.Part
//第一个参数:上传文件的key;第二个参数:文件名;第三个参数:RequestBody对象
MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), imgBody);
Call<ResponseBody> partDataCall = retrofit.create(Api.class).getData(name, filePart);
// 文件上传---需要多个参数怎么办?
@Multipart
@POST("user")
Call<ResponseBody> getData(@PartMap Map<String, MultipartBody.Part> map);
// 1.@PartMap 用于上传多个文件的注解
RequestBody requestBody1 = RequestBody.create(MediaType.parse("image/png"), file1);
RequestBody requestBody2 = RequestBody.create(MediaType.parse("image/png"), file2);
MultipartBody.Part filePart1 = MultipartBody.Part.createFormData("file1", file1.getName(), requestBody1);
MultipartBody.Part filePart2 = MultipartBody.Part.createFormData("file2", file2.getName(), requestBody2);
Map<String,MultipartBody.Part> mapPart = new HashMap<>();
mapPart.put("file1",filePart1);
mapPart.put("file2",filePart2);
Call<ResponseBody> partMapDataCall = retrofit.create(Api.class).getData(mapPart);
//@Header、@Headers,用于添加请求头,一个添加一个,一个添加多个,写法不同
@GET("user")
Call<ResponseBody> getData(@Header("token") String token);
// 1. 添加一个请求头,写在参数里面
@Headers({"phone-type:android", "version:1.1.1"})
@GET("user/emails")
Call<ResponseBody> getHeadersData();
// 1. 添加多个请求头,写在上面的注解里面。
// 上面的都是添加不固定的请求头,如果想添加固定的请求头,可以请求拦截再添加
// 请求占位符
@GET("user/{id}")
Call<ResponseBody> getData(@Query("name") String nameStr, @Path("id") int id);
// @Path 请求占位符