在Andrroid开发中,Retrofit是当下最热的一个网络请求库,Retrofit其实我们可以理解为OkHttp的加强版,它也是一个网络加载框架。底层是使用OKHttp封装的。准确来说,网络请求的工作本质上是OkHttp完成,而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。Retrofit和OkHttp都是square公司写的.
特别注意:
准确来说,Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装。
原因:网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装
App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作
在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析
步骤1:添加Retrofit库的依赖
步骤2:创建 接收服务器返回数据 的类
步骤3:创建 用于描述网络请求 的接口
步骤4:创建 Retrofit 实例
步骤5:创建 网络请求接口实例 并 配置网络请求参数
步骤6:发送网络请求(异步 / 同步 封装了 数据转换、
步骤7: 处理服务器返回的数据
implementation 'com.squareup.retrofit2:retrofit:2.4.0'//Retrofit依赖
implementation 'com.squareup.retrofit2:converter-gson:2.4.0' // 可选依赖,解析json字符所用
<uses-permission android:name="android.permission.INTERNET"/>
public class Bean implements Serializable{
......
}
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
用 动态代理 动态 将该接口的注解“翻译”成一个 Http 请求,最后再执行 Http 请求
注:接口中的每个方法的参数都需要使用注解标注,否则会报错
public interface ApiService {
//ResponseBody,响应体,没有转换成实体类
@POST("user/login")
Call<ResponseBody> login3(@Body RequestBody body);
@GET("10/{page}")
Call<Bean> getData(@Path("page") int page);
// @GET注解的作用:采用Get方法发送网络请求
// getData() = 接收网络请求数据的方法
// 其中返回类型为Call<*>,*是接收数据的类(即上面定义的Bean类)
// 如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call
}
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://gank.io/api/data/福利/") // 设置网络请求的Url地址
.addConverterFactory(GsonConverterFactory.create()) // 设置数据解析器
.build();
关于数据解析器(Converter)
Retrofit支持多种数据解析方式使用时需要在Gradle添加依赖
数据解析器 | Gradle依赖 |
---|---|
Gson | com.squareup.retrofit2:converter-gson:2.0.2 |
Jackson | com.squareup.retrofit2:converter-jackson:2.0.2 |
Simple XML | com.squareup.retrofit2:converter-simplexml:2.0.2 |
Protobuf | com.squareup.retrofit2:converter-protobuf:2.0.2 |
Moshi | com.squareup.retrofit2:converter-moshi:2.0.2 |
Wire | com.squareup.retrofit2:converter-wire:2.0.2 |
Scalars | com.squareup.retrofit2:converter-scalars:2.0.2 |
// 创建 网络请求接口 的实例
ApiService apiService = retrofit.create(ApiService.class);
//对 发送请求 进行封装
Call<Bean> call = apiService.getData(1);
封装了 数据转换、线程切换的操作
//发送异步网络请求
call.enqueue(new Callback<Bean>() {
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) { //请求成功
Log.d(TAG, "getData1: " + Thread.currentThread().getName() + "data:" + response.body().toString());
mBtn1.setText(response.body().toString());
}
@Override
public void onFailure(Call<Bean> call, Throwable t) {
//请求失败
}
})
//发送同步网络请求,需要在子线程调用
Response<Bean> execute = call.execute();
注意response.body().string() 只能使用一次。
通过response类的 body()对返回的数据进行处理