Retrofit简介
- Retrofit是基于RESTful的HTTP网络请求框架的封装,其工作本质是OKHttp完成,在服务端返回数据之后,OkHttp将原始的结果交给Retrofit进行解析
- 代码简洁,易与其他框架联合使用,性能和处理都比较理想
- 高度封装导致扩展性差,若服务器不能给出统一的API的形式,将很难进行处理
Retrofit使用步骤
- 添加Retrofit库依赖
- 创建接收服务器返回数据的实体类(或者直接使用ResponseBody)
- 创建描述网络请求的接口
- 创建Retrofit实例
- 创建网络请求接口的实例,配置请求参数
- 发出请求
1、添加Retrofit库依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
2、创建接收服务器返回数据的实体类
//可以直接使用ResponseBody,但是获取返回的json字符串的写法是“response.body().string()”
public class RetorfitModel{
private int status;
private content content;
private static class content {
private String from;
private String to;
private String vendor;
private String out;
private int errNo;
}
}
3、创建描述网络请求的接口
public interface AppInterService {
@GET("interface/user")
Call<ResponseBody> loginRequest(@QueryMap Map<String,String> params);
}
4、创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://zsk.testurl.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
5、创建网络请求接口的实例,配置请求参数
AppInterService interService = retrofit.create(AppInterService.class);
//多个请求参数可使用Map
Map<String,String> requestMap = new HashMap<>();
requestMap.put("param1",param1);
requestMap.put("param2",param2);
requestMap.put("param3",param3);
requestMap.put("param4",param4);
//传入请求参数
Call<ResponseBody> call = interService.loginRequest(requestMap);
6、发出请求(execute:同步执行,enqueue异步执行)
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
//注意此处的是string()不是toString()
String json = response.body().string();
//......
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
Retrofit注解介绍
网络请求方法注解
我们知道HTTP请求方法包含get、post、delete、put、head、patch、trace、options总共8种。除get外,其他6种都是基于post方法衍生的,最常见的是get和post,而put、delete、post、get这四种最重要,分别对应数据库的增删改查。而Retrofit同样支持八种HTTP请求方法注解,分别是:GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP,其中前7种分别对应HTTP请求方法,而HTTP注解可自定义请求方法,也就是说可以替换前面七种方法
1、HTTP请求方法:
2、Retrofit请求方法注解:
@GET : 对应HTTP的get请求方法
@GET("interface/user")
Call<ResponseBody> getUser();
@POST: 对应HTTP的post请求方法
@POST("interface/user")
Call<ResponseBody> addUser();
@PUT: 对应HTTP的put请求方法
@PUT("interface/user")
Call<ResponseBody> updateUser();
@DELETE: 对应HTTP的delete请求方法
@DELETE("interface/user")
Call<ResponseBody> deleteUser();
HEAD:对应HTTP的head请求方法
PATCH:对应HTTP的patch请求方法
OPTIONS:对应HTTP的options请求方法
HTTP:可替换以上七种,也可以扩展请求方法
/**
* method 表示请的方法,不区分大小写
* path表示路径
* hasBody表示是否有请求体
*/
@HTTP(method = "get", path = "public", hasBody = false)
Call<BaseResult<List<User>>> getUser();
标记类注解
@FormUrlEncoded: 指请求体是一个Form表单,需要和参数类注解@Field,@FieldMap搭配使用
@FormUrlEncoded
@POST("interface/user")
Call<ResponseBody> addUser(@Field("userName") String userName);
@Multipart: 指请求体是一个支持文件上传的Form表单,需要和参数类注解@Part,@PartMap搭配使用
@Multipart
@POST("interface/user")
Call<ResponseBody> uploadFile(@Part MultipartBody.Part file);
@Streaming: 指响应体的数据以流的形式返回,如果不使用默认会把数据全部加载到内存,所以下载文件时需要加上这个注解
@Streaming
@GET("interface/download")
Call<ResponseBody> downloadFile();
网络请求参数注解
@Header / @Headers: 添加请求头,其内容多为实现缓存、认证、平台(Android or iOS)、app版本、操作系统版本、网络类型等信息。注意@Header 用于动态添加请求头,@Headers用于静态添加请求头
// 静态添加
@Headers({
"key1:value1",
"key2:value2"
})
@GET("interface_2/test")
Call<ResponseBody> getHeaderRequest(@QueryMap Map<String,String> params);
//动态添加
@GET("interface_2/test")
Call<ResponseBody> getHeaderRequest(@Header("Token") String token);
@Url: 用于动态的改变Url,当设置Url的时候回替换@GET(“…”)中的内容,故可有写法如下:
@GET
Call<ResponseBody> getUser(@Url String url);
@Body: 以Post方式传递自定义数据类型给服务器,注意如果提交的是一个Map,那么作用相当于 @Field ,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:
/**
Map
*/
FormBody.Builder builder = new FormBody.Builder();
builder.add("key","value");
//以自定义的数据类型作为参数
@POST("user")
Call<BaseResult<String>> addUser(@Body User user);
@Path: 用于动态的改变URL的值
/**
1、发起请求的时候参数“user”的值会替换@GET中{user}的值
2、@Url和@path有相同的意义
*/
@GET("users/{user}/repos")
Call<ResponseBody> getUserResult(@Path("user") String user );
@Field / @FieldMap: Post方式发送请求时提交请求的表单字段和@FormUrlEncoded配合使用
//@Field
@FormUrlEncoded
@POST("user")
Call<ResponseBody> addUser(@Field("userName") String userName);
//@FieldMap
@FormUrlEncoded
@POST("user")
Call<ResponseBody> addUsers(@FieldMap Map<String,String> fieldMap);
@Part / @PartMap: Post方式发送请求时提交请求的表单字段和@Multipart 配合使用,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景
// @Part
@Multipart
@POST("interface_2/lic_continue-upload_pic")
Call<ResponseBody> upLoadPicute(@QueryMap Map<String,String> params,
@Part MultipartBody.Part file);
// @PartMap
@POST("interface_2/lic_continue-upload_pics")
@Multipart
Call<ResponseBody> testFileUpload2(@PartMap Map<String, RequestBody> args,
@Part MultipartBody.Part file);
@Query / @QueryMap: 用于 @GET 方法的查询参数,拼接在Url之后
// @Query 单个参数
@GET("interface_2/user-check_code")
Call<ResponseBody> loginRequest(@Query("name") param);
// @QueryMap 多个参数
@GET("interface_2/lic_continue-con_statistics")
Call<ResponseBody> getAchievementRequest(@QueryMap Map<String,String> params);
Retrofit上传图片实例
1、创建描述网络请求的接口
public interface AppInterService {
@Multipart
@POST("interface_2/lic_continue-upload_pic")
Call<ResponseBody> upLoadPicute(@QueryMap Map<String,String> params,
@Part MultipartBody.Part file);
}
2、创建Retrofit请求,处理响应
private void upLoadByRetrofit(String filePath, String idcardType) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://zsk.testurl.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
AppInterService interService = retrofit.create(AppInterService.class);
HashMap<String,String> params = new HashMap<>();
params = getParams("设置自己的参数");
File file = new File(filePath);
RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"),file);
MultipartBody.Part part = MultipartBody.Part.createFormData("file",file.getName(),imageBody);
//设置参数和图片
Call<ResponseBody> call = interService.upLoadPicute(params,part);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response)
{
try {
String json = response.body().string()
} catch (IOException e) {
e.printStackTrace();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}