Retrofit的使用|青训营笔记
这是我参与「第四届青训营 」笔记创作活动的第5天
以下是通过课程学习记录的笔记,同时搜索各种资料进行补充
(1)简介
Retrofit是Square公司基于RESTful风格推出的网络请求框架封装,是基于OKHttp的网络请求框架的二次封装,其本质仍是OKHttp(通过HTTP进行网络请求)。
Retrofit 是一个 RESTful 风格的 HTTP 网络请求框架的封装。网络请求的工作本质是OKHttp完成,Retrofit仅负责网络请求接口的封装。
Retrofit与OKHttp的关系如下图:
- App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
- 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。
(2)特点
- 基于OKHttp & 遵循Restful API设计风格
REST,即Representational State Transfer的缩写。直接翻译的意思是"表现层状态转化"。 Restful就是一个资源定位、资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。 常用的HTTP动词有下面五个: 1.GET(SELECT):从服务器取出资源(一项或多项)。 2.POST(CREATE):在服务器新建一个资源。 3.PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。 4.PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。 5.DELETE(DELETE):从服务器删除资源。 REST简单来说就是url地址中只包含名词表示资源,使用http动词表示动作进行操作资源
-
功能强大
- 支持同步 & 异步网络请求
- 支持多种数据的解析 & 序列化格式(Gson、Json、XML、Protobuf)
- 提供对Rxjava支持
-
简单易用
- 通过注解配置网络请求参数
- 采用大量设计模式简化使用
-
可扩展性好
- 功能模块高度封装
- 解耦彻底:如:自定义Converters
- Retrofit适用于任何网络请求的需求场景都应优先选择,特别是后台API遵循Restful API设计风格&项目中使用到Rxjava。
(3)使用步骤
- 添加Retrofit库的依赖(包括:Retrofit开源库、OkHttp网络库、数据解析器继承、注册网络权限)
//依赖包导入
dependencies {
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
}
-
创建 接收服务器返回数据(网络请求数据类型) 的类
基本数据类即用于解析数据后自动注入数据的基本类
-
创建描述网络请求 的接口
public interface PostRequest_Interface { @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=") @FormUrlEncoded Call<Translation1> getCall(@Field("i") String targetSentence); //采用@Post表示Post方法进行请求(传入部分url地址) // 采用@FormUrlEncoded注解的原因:API规定采用请求格式x-www-form-urlencoded,即表单形式 // 需要配合@Field 向服务器提交需要的字段 // getCall() = 接收网络请求数据的方法 // 其中返回类型为Call<*>,*是接收数据的类(即上面定义的Translation类) // 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call<ResponseBody> } -
创建Retrofit实例
-
创建 网络请求接口实例 并 配置网络请求参数
-
调用接口方法返回Call对象,并发送网络请求(异步 / 同步)(封装了 数据转换、线程切换的操作)
-
处理服务器返回的数据 通过response类的body()对返回的数据进行处理
public class PostRequest extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
request();
}
public void request() {
//步骤4:创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://fanyi.youdao.com/") // 设置 网络请求 Url
.addConverterFactory(GsonConverterFactory.create()) //设置使用Gson解析(记得加入依赖)
//.addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 支持RxJava平台
.build();
// 步骤5:创建 网络请求接口 的实例
PostRequest_Interface request = retrofit.create(PostRequest_Interface.class);
//对 发送请求 进行封装(设置需要翻译的内容)
Call<Translation1> call = request.getCall("I love you");
//步骤6:发送网络请求(异步)
call.enqueue(new Callback<Translation1>() {
//请求成功时回调
@Override
public void onResponse(Call<Translation1> call, Response<Translation1> response) {
// 步骤7:处理返回的数据结果:输出翻译的内容
System.out.println(response.body().getTranslateResult().get(0).get(0).getTgt());
}
//请求失败时回调
@Override
public void onFailure(Call<Translation1> call, Throwable throwable) {
System.out.println("请求失败");
System.out.println(throwable.getMessage());
}
});
}
}