前言 Retrofit是squareup公司的开源力作,和同属squareup公司开源的OkHttp,一个负责网络调度,一个负责网络执行,为Android开发者提供了即方便又高效的网络访问框架。...retrofit2.Converter,自己实现Converter和ConverterFactory。在创建Retrofit对象时,可以插入我们自定义的ConverterFactory。...这是怎么回事呢,我们知道Retrofit使用了建造者模式,建造者模式的特定就是实现了建造和使用的分离,所以建造者模式的建造函数里,一般会有很复杂的对象创建和初始化过程,所以我们要看一下Retrofit的...针对返回的数据类型,由于目标数据类型与业务有关,是不确定的,Retrofit无法提供一个万能的转换类,所以Retrofit提供了扩展接口,允许开发者自己定义ConverterFactory和Converter...针对这种Call对象的易变性,Retrofit也是无法提供一个万能的实现类,所以也是提供了扩展解耦,允许开发者自己定义CallAdapterFactory和CallAdapter,去实现潜在的Call类型转换
去执行,执行的结果返回Response,再根据转换器进行解析成相对应的返回值类型T。...其中,call对象有excute()和enqueue()方法,分别为同步和异步进行网络请求。...invoke方法为接口方法的具体实现,invoke()方法里面的method为具体的方法(在demo中为contributors方法);args是该方法的参数(在demo中为new String[]{"....Call 转化为T (注意和okhttp3.Call 区分开来) ,retrofit2.Call 表示的是对一个Retrofit的接口方法的调用,也就是我们举得例子 Call和请求方式和请求体。
现在的项目界面都是按iOS的风格,虽然界面无法发挥出我们大Android的风格,网络框架动不动就是mvp+ okhttp +retrofit+rxjava,mvvm+databind的模式,但是网络框架什么的...下面分析下总结的几点: 1、创建一个接口来进行HTTP请求,这就是写一个API接口类来存放所需要实现的服务端接口类。...= null) { throw new IllegalStateException("Base URL required."); } 简单说下 Converter:数据转换器....addConverterFactory(RDConverterFactory.create()) CallAdapter:请求适配器,用于将retrofit2.Call网络请求类型转换为...从结构图来看,BuiltInConverter只转换ResponseBody和RequestBody,其他的都不进行转换。 ?
首先,我们要创建一个Retrofit Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://gank.io.../") .build(); 这里大家就看到我们的baseUrl了,就是我们Gank接口的前缀,我们现在有了retrofit,通过他的create方法就可以创建我们的接口对象了...答案是否定的,我们运行之后可以看到这样一行错误 IllegalArgumentException: Unable to create converter for class com.liuguilin.retrofitsample.GankBean...这里很直观的说明,不能创建一个转换器,我擦,那怎么办?...RxJavaCallAdapterFactory.create()) .build(); api = retrofit.create(PostApi.class); 这里我们需要增加addCallAdapterFactory为我们后面的
它通过基于 REST 的 web 服务检索和上传 JSON (或其他结构化数据)变得相对容易。在使用中,您可以配置用于数据序列化的转换器。...对于 JSON ,通常使用Gson ,但是可以添加自定义转换器来处理 XML 或其他协议。Retrofit 对 HTTP 请求使用 OkHttp 库。...实现流程 那么现在就给大家解释下使用的每个步骤 创建接口 首先我们要创建 UserMgrService 接口 /** * @author fishinwater-1999 * @version 2019...和 password 是怎么的话,我这里简单说下 比如说我们现在随便打开一个网页,就拿百度图片里搜索 Github 页面为例: 后端写服务器的同学会通过这些参数,像 HashMap get(“...- LoginFragment 总结 想必看到这儿的读者对 Retrofit 的使用都已近有了一定的了解,但 Retrofit 的好处并不只是这些,还有很多跟深入的只是需要了解,但本文限于篇幅,无法向大家一一介绍
代表着格式化和解析(功能上和转换器Converter还是蛮像的) Formatter它的继承树如下: ? 从包结构中看: ?...它有点类似于现在的java.util.Currency类 MontetaryAmount代表的是某种货币的具体金额。通常它都会与某个CurrencyUnit绑定。...,它是用于管理转换器、格式化器们的。...从名字可以看出,它主要是创建一个FormattingConversionService,而它上面说了它既还有转换器,又有格式化器~~~ public class FormattingConversionServiceFactoryBean...DateFormat DateFormat根据当前语言环境格式化日期和时间。DateFormat是一个抽象类,所以不能直接new创建实例对象。但该类为我们提供了工厂方法方便我们使用。
---生产转换器的工厂 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); } /** 在应用程序上下文创建时无法立即初始化实际属性源的情况下
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接口。
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接口。
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
ServiceMethod 类的作用就是把接口的方法适配为对应的 HTTP call 。...method.getParameterAnnotations(); } 在构造方法中没有什么大的动作,那么就单刀直入 build() 方法: public ServiceMethod build() { // 根据接口方法的注解和返回类型创建...ExecutorCallbackCall 是实现了 retrofit2.Call ,这里注意下,是 Retrofit 中的 Call 而不是 OkHttp 中的 Call 。...使用了装饰者模式把 retrofit2.Call 又包装了一层。...了解过 OkHttp 的同学应该都知道这两个方法的区别,就是多了异步执行和回调的步骤而已。
---- 新一代类型转换组件简介 ConverterRegistry和ConversionService的关系密不可分,前者为后者提供转换器管理支撑,后者面向使用者提供服务。...//因此如果这里存在转换器,但是为NO_MATCH ,表示不存在对应的转换器可以转换该类型对,返回null即可 return (converter !...} else { //类型对和转换器时多对多的关系,通过convertibleTypes方法,我们可以得到一个转换器可以转换的所有类型 //但是我们还需要知道一个类型可以被多少个转换器处理...此访问器仅用作需要简单类型强制但无法以任何其他方式访问寿命更长的 ConversionService 实例的代码路径的后备。...因为该类实现了InitializingBean接口,因此需要重写该方法,在bean属性被设置后,会回调该接口 @Override public void afterPropertiesSet() { //创建默认的转换器服务
1.复杂对象的创建:不能直接new的对象,需要一个相对复杂的创建过程。...,工厂中所有的单例的bean随之创建 *在工厂关闭时,bean销毁 *细节: bean的初始化方法和销毁方法:init-method destroy-method ============...:在spring为bean注入值时,一些简单转换如:String->Integer Boolean,但是 更复杂的转换,需要单独定制类型转换器,来支持spring完成类型转换...public void setAsText(String text) throws IllegalArgumentException { SimpleDateFormat format=new SimpleDateFormat...: *将转换器交给spring,并指明转换器用途
作者:xcheng_ 链接:https://www.jianshu.com/p/07fe489a53f2 声明:本文已获xcheng_投稿发表,转发等请联系原作者授权 http请求一直是开发中无法避免的存在...注意的是可以手动调用LifeCall.onChanged(LifeCycle.Event.ON_ANY)取消请求用于你想处理的任何场景,如果isDisposed()返回为true,在异步Callback...自定义CallAdapter.Factory retrofit的解耦灵活我们可以做很多自定义的配置,自定义Factory返回我们的Call接口对象,只需在创建retrofit对象是调用addCallAdapterFactory...return responseType; } @Override public Call adapt(retrofit2...调度方法和生命周期关联,在主线程执行时再次做判断。
前言 最近遇到一个小伙伴问前端枚举转换问题,才意识到可以通过转换器(Converter)自动将前端传入的字段值使用枚举接收。 我自己捣鼓了一番,现在记录笔记分享一下!...这里使用的是 MyBatis-Plus 和 SpringBoot 2.3.4.RELEASE 1 实现过程 配置转换器 /** * @author liuzhihang * @date 2021/8...下面介绍下项目的内容和代码,方便理解。...这样就可以实现效果,请求参数为数字,接收对象字段为枚举,返回字段也是 code。 效果 测试结果 测试结果经过验证,是可以胜任传入数值和字符串的。 也可以结合异常处理器,返回通用异常。...// 枚举转换 registry.addConverterFactory(enumConverterFactory); } } 这种就需要咱们创建
揭秘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属于标准行为,重复劳动是可以标准化的。
无需创建映射 - 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
MyBatis 内置了很多类型处理器(typeHandlers),详细可以参考MyBatis官方文档,对枚举类的处理的是通过EnumTypeHandler和EnumOrdinalTypeHandler两个处理器来处理了...例如: MAN("0", "男") 我们来查看源码分析下原因,我们以EnumTypeHandler为例来说明下。...而EnumOrdinalTypeHandler转换器也只能处理Int,String 类型。故我们需要自定义转换器来处理。...分析MyBatis 源码我们可以得知,各个转换器都是继承BaseTypeHandler 基类的。为了实现代码的通用性,首先我们实现了一个枚举基类,然后定义一个通用的转换器。...getKey(); /** * 显示的信息 * @return */ String getValue(); } 在枚举记录中我们定义了两个通用的获取key和value
ConversionService 是 Spring 类型转换器体系中的核心接口,它定义了是否可以完成转换( canConvert()) 与 类型转换( convert())两类接口。...如何自定义类型转换器?...(关于 InitializingBean 详情请参考:【死磕 Spring】----- IOC 之 深入分析 InitializingBean 和 init-method)。...createConversionService() 其实就是创建一个 DefaultConversionService 实例对象,对于 DefaultConversionService 小编在上篇博客已经分析了...>) converter); } else { throw new IllegalArgumentException("Each converter object must implement
对于MVC框架,参数绑定一直觉得是很神奇很方便的一个东西,在参数绑定的过程中利用了属性编辑器、类型转换器 参数绑定流程 参数绑定:把请求中的数据,转化成指定类型的对象,交给处理请求的方法 请求进入到DisptacherServlet...PropertyEditorSupport { //指定的date格式,如"yyyy-MM-dd" private final DateFormat dateFormat; //是否允许字符串为空...{ //判断字符串是否为空 if (this.allowEmpty && !...CustomDateEditor的源码可以看出,最重要的是重写setAsText方法,先校验下字符串格式符不符合要求,不符合要求就抛出异常,再根据字符串转成指定DateFormat的Date对象 类型转换器...刚刚讲的属性编辑器是用来填充bean中的属性的,类型转换器是负责从数据转换成一个bean所以在转换的过程中,需要属性编辑器帮忙填充属性,那么应该持有一堆属性编辑器(bean有各种各样的属性),那么持有一个
领取专属 10元无门槛券
手把手带您无忧上云