Retrofit的使用|青训营笔记

104 阅读4分钟

Retrofit的使用|青训营笔记

这是我参与「第四届青训营 」笔记创作活动的第5天

以下是通过课程学习记录的笔记,同时搜索各种资料进行补充

(1)简介

Retrofit是Square公司基于RESTful风格推出的网络请求框架封装,是基于OKHttp的网络请求框架的二次封装,其本质仍是OKHttp(通过HTTP进行网络请求)。

Retrofit 是一个 RESTful 风格的 HTTP 网络请求框架的封装。网络请求的工作本质是OKHttp完成,Retrofit仅负责网络请求接口的封装

Retrofit与OKHttp的关系如下图:

image-20220819140216656.png

  • 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)使用步骤

  1. 添加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'
  }
  1. 创建 接收服务器返回数据(网络请求数据类型) 的类

    基本数据类即用于解析数据后自动注入数据的基本类

  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>
    }
    
  3. 创建Retrofit实例

  4. 创建 网络请求接口实例 并 配置网络请求参数

  5. 调用接口方法返回Call对象,并发送网络请求(异步 / 同步)(封装了 数据转换、线程切换的操作)

  6. 处理服务器返回的数据 通过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());
            }
        });
    }
}
​