IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Retrofit学习 -> 正文阅读

[网络协议]Retrofit学习

我的OkHttp学习1
我的OkHttp学习2

一.Retrofit介绍

我们都知道,Retrofit的定义是
Retrofit是一个RESTful的HTTP网络请求框架的封装,网络请求的工作本质上是OkHttp完成,而Retrofit仅负责网络请求接口的封装

App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后由OkHttp完成后续的请求操作;服务器数据返回后,OkHttp将原始的结果交给Retrofit,根据用户需求对结果进行解析;

那么什么是rest规范呢?

1.rest规范

rest即Representational State Transfer,翻译过来就是资源表现层状态转换。下面我说下我对这个规范的理解

资源:一个URI代表一个资源,比如是一个文本,一个图片等。
表现层:即资源的表现形式,比如文本可以用txt形式表现,图片可以用jpg,png形式表现。
状态转换:即将资源的状态进行转换,比如得到资源,更改资源,删除资源等,对应HTTP四个方法,即GET,POST,PUT,DELETE

它有两个非常值得注意的点
①第一个就是,URI中不应该包括动词(最常见的URI就是URL)。比如

错误写法正确写法
https://localhost:8080/myweb/getDogsGET /rest/api/dogs(获取所有小狗狗)
https://localhost:8080/myweb/addDogsPOST /rest/api/dogs(添加一个小狗狗)
https://localhost:8080/myweb/updateDogs/:dog_idPUT /rest/api/dogs/:dog_id(修改一个小狗狗)
https://localhost:8080/myweb/deleteDogs/:dog_idDELETE /rest/api/dogs/:dog_id(删除一个小狗狗)

②第二个就是,无状态
即所有的资源都可以通过URI定位,而不是知道前面的才知道后面的(RxJava的响应式编程就是知道前面的才能干后面的)。如果是有状态的,则后面的操作依赖于上一步的结果。如果是无状态的,则可以直接进行后面的操作。比如查工资,如果是有状态,则需要先登录系统,然后点击这个,然后再点击那个。。。如果是无状态,则可以直接查询工资。

2.基本使用

基本使用很简单,我在这一篇文章中有写到,需要注意的一点是,RxJava的返回值是Observable类型,而传统的Retrofit的返回值是Call类型

报错1:IllegalArgumentException: Unable to create call adapter for io.reactivex.Observable<com.example.retrofittest.bean.Project
解决方案
报错2: java.lang.IllegalStateException: Already executed.
解决方案

需要整理一下的是它的注解:好文章推荐

在这里说下它比较常见的,一个是Path,可以理解为替换
在这里插入图片描述
一个是Query,可以理解为键值对,但是它是在GET的时候用
一个是Field,也可以理解为键值对,但是它在POST的时候用
其他的像GET,POST,PUT,DELETE就分别对应HTTP的四种动作。

二.执行时,源码的总体流程

这里我推荐这一篇文章

1.Retrofit 的请求流程

我把请求流程搬到这里来,方便后面复习

我们在调用 Service 接口的 请求网络的方法时,会调用 InvocationHandlerinvoke方法(动态代理)
然后执行 loadServiceMethod方法并返回一个 HttpServiceMethod 对象并调用它的 invoke方法
然后执行 OkHttpCallenqueue方法(OkHttpCall就是在Service接口中方法的返回值类型的对象)
本质执行的是 okhttp3.Callenqueue方法
当然这期间会解析方法上的注解,方法的参数注解,拼成 okhttp3.Call 需要的 okhttp3.Request 对象
然后通过Converter 来解析返回的响应数据,并回调 CallBack 接口

2.注解的解析流程

ServiceMethod.parseAnnotations(this, method); 方法中开始的
具体内容是在 RequestFactory 类中,进行解析注解的
调用 RequestFactory.parseAnnotations(retrofit, method); 方法实现的

三.Retrofit的设计模式

这里我推荐这一篇文章
搬运一下

首先retrofit本身就是一个门面/外观模式,它的构建是建造者模式(Retrofit类就是Retrofit框架提供给我们的外观类),
同时还可以add各种各样的工厂,是策略模式add方法里面的参数用到了工厂模式
还有适配器模式,比如用Gson适配返回的数据
他的create方法用到了代理模式,而且是动态代理
还用到了装饰者模式ExecuteCallBack 使用装饰者模式来封装callbackExecutor,用于完成线程的切换
还用到了静态代理模式。(ExecutorCallbackCall是代理,而里面真正去执行网络请求的还是OkHttpCall
他的网络请求,用到了观察者模式call是被观察者,CallBack是观察者

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:59:31  更:2021-11-09 20:01:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:00:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码