首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从架构角度看Retrofit的作用、原理和启示

前言 Retrofit是squareup公司的开源力作,和同属squareup公司开源的OkHttp,一个负责网络调度,一个负责网络执行,为Android开发者提供了即方便又高效的网络访问框架。...retrofit2.Converter,自己实现Converter和ConverterFactory。在创建Retrofit对象时,可以插入我们自定义的ConverterFactory。...这是怎么回事呢,我们知道Retrofit使用了建造者模式,建造者模式的特定就是实现了建造和使用的分离,所以建造者模式的建造函数里,一般会有很复杂的对象创建和初始化过程,所以我们要看一下Retrofit的...针对返回的数据类型,由于目标数据类型与业务有关,是不确定的,Retrofit无法提供一个万能的转换类,所以Retrofit提供了扩展接口,允许开发者自己定义ConverterFactory和Converter...针对这种Call对象的易变性,Retrofit也是无法提供一个万能的实现类,所以也是提供了扩展解耦,允许开发者自己定义CallAdapterFactory和CallAdapter,去实现潜在的Call类型转换

2.3K100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    「2020 新手必备 」极速入门 Retrofit + OkHttp 网络框架到实战,这一篇就够了!

    它通过基于 REST 的 web 服务检索和上传 JSON (或其他结构化数据)变得相对容易。在使用中,您可以配置用于数据序列化的转换器。...对于 JSON ,通常使用Gson ,但是可以添加自定义转换器来处理 XML 或其他协议。Retrofit 对 HTTP 请求使用 OkHttp 库。...实现流程 那么现在就给大家解释下使用的每个步骤 创建接口 首先我们要创建 UserMgrService 接口 /** * @author fishinwater-1999 * @version 2019...和 password 是怎么的话,我这里简单说下 比如说我们现在随便打开一个网页,就拿百度图片里搜索 Github 页面为例: 后端写服务器的同学会通过这些参数,像 HashMap get(“...- LoginFragment 总结 想必看到这儿的读者对 Retrofit 的使用都已近有了一定的了解,但 Retrofit 的好处并不只是这些,还有很多跟深入的只是需要了解,但本文限于篇幅,无法向大家一一介绍

    1.3K30

    【小家Spring】聊聊Spring中的格式化:Formatter、AnnotationFormatterFactory、DateFormatter以及@DateTimeFormat...

    代表着格式化和解析(功能上和转换器Converter还是蛮像的) Formatter它的继承树如下: ? 从包结构中看: ?...它有点类似于现在的java.util.Currency类 MontetaryAmount代表的是某种货币的具体金额。通常它都会与某个CurrencyUnit绑定。...,它是用于管理转换器、格式化器们的。...从名字可以看出,它主要是创建一个FormattingConversionService,而它上面说了它既还有转换器,又有格式化器~~~ public class FormattingConversionServiceFactoryBean...DateFormat DateFormat根据当前语言环境格式化日期和时间。DateFormat是一个抽象类,所以不能直接new创建实例对象。但该类为我们提供了工厂方法方便我们使用。

    3.9K31

    Spring读源码系列番外篇---02---PropertyResolver的结构体系剖析---上

    ---生产转换器的工厂 ConditionalConverter---有条件的转换 ConditionalGenericConverter--继承GenericConverter和ConditionalConverter...> targetType); } ConverterRegistry主要负责管理转换器的添加和移除 ---- ConfigurableConversionService—集成上面两个接口的功能 /**...private final Converters converters = new Converters(); //转换器缓存---ConverterCacheKey是以SourceType和...= null) { //如果缓存中有直接返回,如果没有即转换器为NO_MATCH ,那么返回null //可能直接因为尝试去寻找过了,发现没有对应的转换器,那么就会在缓存中标记一下 //当前这个转换组合没有对应的转换器...> named(String name) { return new ComparisonPropertySource(name); } /** 在应用程序上下文创建时无法立即初始化实际属性源的情况下

    85840

    Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    name=LYL 1.2 测试结果 ​         OK,可以看得出来是已经成功把参数值和编码方式和sessionId给查询出来了         一般情况下,在SpringMVC中都有对...二、自定义参数类型转换器 前端传来的参数全部为字符串类型,SpringMVC使用自带的转换器将字符串参数转为需要的类型。...”的值转换为所需类型“java.util.Date”;嵌套异常为org.springfframework.core.covert.ConversionFailedException:无法将值“2025-...01-01”从类型[java.lang.SString]转换为类型[java.util.Date];嵌套异常为java.lang.IllegalArgumentException] 2.1 编写类型转换器类...比如参数格式为 birthday=2025-01-01 时,SpringMVC就无法解析参数。此时需要自定义参数类型转换器。 首先得定义类型转换器类,实现Converter接口。

    30230

    _Spring MVC获取参数和自定义参数类型转换器及编码过滤器

    name=LYL 1.2 测试结果  OK,可以看得出来是已经成功把参数值和编码方式和sessionId给查询出来了         一般情况下,在SpringMVC中都有对Servlet原生对象的方法的替代...二、自定义参数类型转换器前端传来的参数全部为字符串类型,SpringMVC使用自带的转换器将字符串参数转为需要的类型。...”的值转换为所需类型“java.util.Date”;嵌套异常为org.springfframework.core.covert.ConversionFailedException:无法将值“2025-...01-01”从类型[java.lang.SString]转换为类型[java.util.Date];嵌套异常为java.lang.IllegalArgumentException]2.1 编写类型转换器类...比如参数格式为 birthday=2025-01-01 时,SpringMVC就无法解析参数。此时需要自定义参数类型转换器。 首先得定义类型转换器类,实现Converter接口。

    20310

    【Android】Retrofit2.0源码解析

    equals(pathSegments.get(pathSegments.size() - 1))) { throw new IllegalArgumentException("baseUrl...validateEagerly(标识):先不说,后面会用到 总:完成基本的配置,创建一个Retrofit对象 2.Service的创建以及接口的调用 我们创建了一个接口的实例,用于调用接口。...动态代理 下面我们来一步步分析这个create方法: Utils.validateServiceInterface(service); 源码我就不贴出来了,这个方法主要就是判断了参数service是否为Interface...return platform.invokeDefaultMethod(method, service, proxy, args); } 第一个if用来判断的是否为Object...HTTP 请求 2、callAdapter:确定返回的retrofit2.Call类型(接口定义时的返回类型,例子中的Call); 3、responseConverter

    1.1K90

    Spring读源码系列番外篇---06----类型转换---下---ConversionService相关家族

    ---- 新一代类型转换组件简介 ConverterRegistry和ConversionService的关系密不可分,前者为后者提供转换器管理支撑,后者面向使用者提供服务。...//因此如果这里存在转换器,但是为NO_MATCH ,表示不存在对应的转换器可以转换该类型对,返回null即可 return (converter !...} else { //类型对和转换器时多对多的关系,通过convertibleTypes方法,我们可以得到一个转换器可以转换的所有类型 //但是我们还需要知道一个类型可以被多少个转换器处理...此访问器仅用作需要简单类型强制但无法以任何其他方式访问寿命更长的 ConversionService 实例的代码路径的后备。...因为该类实现了InitializingBean接口,因此需要重写该方法,在bean属性被设置后,会回调该接口 @Override public void afterPropertiesSet() { //创建默认的转换器服务

    56420

    SpringBoot 使用转换器将前端参数转换为枚举

    前言 最近遇到一个小伙伴问前端枚举转换问题,才意识到可以通过转换器(Converter)自动将前端传入的字段值使用枚举接收。 我自己捣鼓了一番,现在记录笔记分享一下!...这里使用的是 MyBatis-Plus 和 SpringBoot 2.3.4.RELEASE 1 实现过程 配置转换器 /** * @author liuzhihang * @date 2021/8...下面介绍下项目的内容和代码,方便理解。...这样就可以实现效果,请求参数为数字,接收对象字段为枚举,返回字段也是 code。 效果 测试结果 测试结果经过验证,是可以胜任传入数值和字符串的。 也可以结合异常处理器,返回通用异常。...// 枚举转换 registry.addConverterFactory(enumConverterFactory); } } 这种就需要咱们创建

    3.7K20

    Spring读源码系列番外篇04----类型转换--上---老旧的PropertyEditor

    揭秘Spring类型转换 - 框架设计的基石 ---- 古老的PropertyEditor PropertyEditor是jdk提供服务于gui的类型转换器,但是由于和spring初期xml类型转换需求相同...更复杂的类型可能无法支持 getAsText 和 setAsText,但会支持 paintValue 和 getCustomEditor。...高于 defaultEditors 自定义编辑器组:customEditors和customEditorsForPath 它俩为互斥关系 private Map<Class<?...Person.cats[0].uuid这样格式也是ok的 ---- PropertyEditorRegistrySupport源码 //注册中心的实现类---负责管理,删除,增加PropertyEditor,和查找指定的转换器...接口) 将写好的编辑器注册到注册中心PropertyEditorRegistry 显然步骤1属个性化行为无法替代,但步骤2属于标准行为,重复劳动是可以标准化的。

    68010

    JMeter5.1核心类SaveService解析jmx文件的源码分析

    无需创建映射 - XStream 的 API 提供了默认的映射大部分对象序列化。 性能 - XStream 快速和低内存占用,适合于大对象图或系统。...干净的XML - XStream 创建一个干净和紧凑 XML 结果,这很容易阅读。 不需要修改对象 - XStream 可序列化的内部字段,如私有和最终字段,支持非公有制和内部类。...可自定义的转换策略 - 定制策略可以允许特定类型的定制被表示为XML的注册。 安全框架 - XStream 提供了一个公平控制有关解组的类型,以防止操纵输入安全问题。...XStream对象,用于解析和存储测试jmx文件和测试报告 // 解析和存储测试jmx文件 private static final XStream JMXSAVER = new XStreamWrapper...= null) { throw new IllegalArgumentException("Problem loading XML from:'"+file.getAbsolutePath

    1.7K42

    MyBatis常用特性运用

    MyBatis 内置了很多类型处理器(typeHandlers),详细可以参考MyBatis官方文档,对枚举类的处理的是通过EnumTypeHandler和EnumOrdinalTypeHandler两个处理器来处理了...例如: MAN("0", "男") 我们来查看源码分析下原因,我们以EnumTypeHandler为例来说明下。...而EnumOrdinalTypeHandler转换器也只能处理Int,String 类型。故我们需要自定义转换器来处理。...分析MyBatis 源码我们可以得知,各个转换器都是继承BaseTypeHandler 基类的。为了实现代码的通用性,首先我们实现了一个枚举基类,然后定义一个通用的转换器。...getKey(); /** * 显示的信息 * @return */ String getValue(); } 在枚举记录中我们定义了两个通用的获取key和value

    41330

    SpringMVC类型转换器、属性编辑器PropertiesEditor源码分析CustomDateEditor源码分析TypeConverterDelegate源码分析

    对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet...PropertyEditorSupport { //指定的date格式,如"yyyy-MM-dd" private final DateFormat dateFormat; //是否允许字符串为空...{ //判断字符串是否为空 if (this.allowEmpty && !...CustomDateEditor的源码可以看出,最重要的是重写setAsText方法,先校验下字符串格式符不符合要求,不符合要求就抛出异常,再根据字符串转成指定DateFormat的Date对象 类型转换器...刚刚讲的属性编辑器是用来填充bean中的属性的,类型转换器是负责从数据转换成一个bean所以在转换的过程中,需要属性编辑器帮忙填充属性,那么应该持有一堆属性编辑器(bean有各种各样的属性),那么持有一个

    1.2K80
    领券