一、Retrofit介绍
简介:
- Retrofit是Square公司基于RESTful风格推出的网络框架封装
- Retrofit与OKHttp的关系:
Retrofit是基于OKHttp的网络请求的二次封装,其本质仍是OKHttp - Retrofit库包结构
与其它网络库的对比:
-
AndroidAsynHttp
基于HttpClient,作者已停止维护,Android5.0不再使用HttpClient因此不推荐使用。 -
Volley:
基于HttpUrlConnection,Google官方推出,只适合轻量级网络交互如数据传输小,不适合大文件上传下载场景。
Retrofit优点:
- API设计简洁易用,注解化配置高度解耦、支持多种解析器、支持Rxjava。
二、Retrofit使用
Step1:
Retrofit开源库、OkHttp网络库、数据解析器集成、注册网络权限 。
- 依赖包导入
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
maven方式:
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.4.0</version>
</dependency>
- 添加网络权限
<uses-permission android:name="android.permission.INTERNET" />
Step2:
创建接口设置请求类型与参数。
//所需解析json对应的类
public class UserInfoModel {
public String code; //属性
}
//接口
public interface UserMgrService {
@GET("login")
Call<UserInfoModel> login(@Query("username") String username, @Query("pwd") String password);
}
Step3:
创建Retrofit对象、设置数据解析器。
//创建Retrofit对象 注意url后面有一个'/'。
Retrofit retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/")
.addConverterFactory(GsonConverterFactory.create()).build();
Step4:
生成接口对象。
// 获取UserMgrService对象
UserMgrService userMgrService = retrofit.create(UserMgrService.class);
Step5:
调用接口方法返回Call对象。
//调用login
final Call<UserInfoModel> call = userMgrService.login("admin", "admin");
Step6:
发送请求(同步、异步)。
- 同步:调用Call对象的execute(),返回结果的响应体
- 异步:调用Call对象的enqueue(),参数是一个回调
//同步请求
Response<UserInfoModel> response = call.execute();
//异步请求
call.enqueue(new Callback<UserInfoModel>() {
@Override
public void onResponse(Call<UserInfoModel> call, Response<UserInfoModel> response) {
}
@Override
public void onFailure(Call<UserInfoModel> call, Throwable t) {
}
});
Step7:
处理返回数据。
//发送请求
//同步请求需要开启新线程执行,否则会报错
new Thread(new Runnable() {
@Override
public void run() {
Response<UserInfoModel> response = null;
try {
response = call.execute();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("code:" + response.body().code);
}
}).start();
//异步请求
call.enqueue(new Callback<UserInfoModel>() {
@Override
public void onResponse(Call<UserInfoModel> call, Response<UserInfoModel> response) {
}
@Override
public void onFailure(Call<UserInfoModel> call, Throwable t) {
}
});
Step3-7:
//创建Retrofit对象 注意url后面有一个'/'。 Retrofit retrofit = new Retrofit.Builder().baseUrl("http://localhost:8080/") .addConverterFactory(GsonConverterFactory.create()).build(); // 获取UserMgrService对象 UserMgrService userMgrService = retrofit.create(UserMgrService.class); //调用login final Call<UserInfoModel> call = userMgrService.login("admin", "admin"); //异步请求 call.enqueue(new Callback<UserInfoModel>() { @Override public void onResponse(Call<UserInfoModel> call, >Response<UserInfoModel> response) { } @Override public void onFailure(Call<UserInfoModel> call, Throwable t) { } });
常见参数注解:
@GET,@POST : 确定请求方式
@Path : 请求URL的字符替代
@Query:要传递的参数
@QueryMap:包含多个@Query注解参数
@body:添加实体类对象
@FormUrlEncoded:URL编码
三、总结
- Retrofit是基于Okhttp网络库的高级封装。
- 采用纾解、网络请求参数配置更灵活,扩展性更好。
- RESTful风格的API优先选用Retrofit。