• Retrofit 使用简介


    一,简介

    Retrofit 是目前使用广泛的 Http Client 框架,它适用于 Android 和 Java。
    但需要注意的是,Retrofit 本身并不是一个网络请求框架,而是一个网络请求框架的封装。在 Retrofit 框架中,网络请求不是由 Retrofit 本身来操作的,而是由它的内核(2.x 版本默认内置为 OkHttp)来实现的:

    上图就是使用 Retrofit 实现网络请求的流程:

    1. 首先应用层通过 Retrofit 层来封装请求参数,header,url 等信息
    2. Retrofit 通过 OkHttp 来完成后续的请求操作
    3. 服务端处理完请求后,将结果返回给OkHttp层
    4. OkHttp 层再将原始结果返回给 Retrofit 层,Retrofit 根据用户的需求对结果进行解析

    Retrofit使得开发者能专注于请求接口的封装工作,网络请求的工作就交给了OkHttp。

    二,使用

    1. 定义接口

    官网上介绍说 “Retrofit turns your HTTP API into a Java interface.”,Retrofit 会将每一个 Http 的 API 请求转化为一个 Java 接口。
    结合官网上的示例,我们可以这样理解这句话的含义:
    比如我们现在有一个 API 接口地址为:

    https://api.github.com/users/zhangsan/repos
    

    那么我们就可以根据这个 API 地址来定义一个 Java 接口,也就是将这个 API 地址抽象成为了一个 Java 接口:

    public interface GitHubService {
      @GET("users/{user}/repos")
      Call<List<Repo>> listRepos(@Path("user") String user);
    }
    

    在上面这个定义的接口 GithubService 中,有一个被 @GET 注解标识的 listRepos 方法,它表示的是这个 listRepos 方法是一个 GET 请求,并且这 GET 请求的路径为 “user/{user}repos”。这个路径之后会与创建 Retrofit 对象时填写的 baseUrl 拼接起来,形成一个完整的 API 地址。

    {user} 这种写法表示的是这部分内容并不是写死的,相当于占位符的作用,它的实际类型则是 listRepos 方法中的参数 (String user),这里传入的是一个 String 类型的参数。所以 {user} 的实际类型是一个字符串。

    那么方法参数前的 @Path 注解又是干什么用的呢?
    @Path("user") 是一个参数相关的注解,它的作用是:假如传给 listRepos 方法的参数为 null 的话,那么就会使用 “user” 这个字符串当做为默认值代替传入到请求路径中。

    List 则表示的从服务器返回的数据,我们将它定义成了一个实体类

    2.创建 Retrofit 对象

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .build();
    

    可以看到 Retrofit 的创建是通过一个 Builder 设计模式来实现的,同时需要指定 baseUrl 的值,与之前定义接口时定义的请求路径一起形成完整的请求地址。

    3.使用接口创建「请求对象」

    创建完 retrofit 对象之后,通过调用它的 create() 方法来创建 GithubService 接口的实例,之后我们就可以使用 service 实例来进行网络请求了。

    GithubService service = retrofit.create(GithubService.class);
    
    Call<List<Repo>> repos = service.listRepos("zhangsan");
    

    接着调用之前定义好的 GtihubService接口的 listRepos 方法将会返回一个 Call 对象,Call 对象代表了被封装的请求和响应,它与 OkHttp 中的语法类似。

    4. 通过 Call 对象来发送网络请求

    通过 Call 对象就可以发起同步或者异步的网络请求了。

    //发起异步请求
    repos.enqueue(new Callback<List<Repo>>() {
        @Override
        public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
            
        }
        @Override
        public void onFailure(Call<List<Repo>> call, Throwable t) {
        }
    });
    
  • 相关阅读:
    FreeMarker MyEclipse IDE
    Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
    Mybatis SqlSessionTemplate 源码解析
    Mybatis Interceptor 拦截器原理 源码分析
    MyBatis Mapper 接口如何通过JDK动态代理来包装SqlSession 源码分析
    MyEclipse SVN 下面切换用户的解决方案
    SpringMVC 多个数据源 配置多个事物管理器 Multiple Transaction Managers
    Activiti 获取定义
    [No000066]python各种类型转换-int,str,char,float,ord,hex,oct等
    [No000065]python 获取当前时间
  • 原文地址:https://www.cnblogs.com/liyutian/p/9696873.html
Copyright © 2020-2023  润新知