.今天我就带大家来看一下Retrofit究竟是如何使用,以及内部工作原理 一.概述 作用 OKHttp 做的更加简洁,更加方便,同时影藏了oKHttp的某些功能。...type-safe retrofit是基于okhttp的,因此retrofit所有的工作都是围绕在请求体和响应体来展开的,Retrofit提供了各种类型的转换器以及可以自定义转换器,去构建你的请求体...,以及通过转换器去序列化响应体为你想要的类型,从而保证你的请求体和响应体都是安全的 二.使用 1....,将标注及参数生成OkHttp所需的Request对象。...面试题分享 Retrofit请求参数说明 Retrofit中的设计模式 1.
官方给出的弃用理由是: Spring的注解仅适用于字段、参数、返回值。 JSpecify注解在Spring注解基础上增加了类型、类。..."" : x; } // @NullMarked: // // 一旦某个类或包被标记为@NullMarked,则其中所有未使用@Nullable明确标记的参数、返回值或字段都将被视为不可为null。...// 在代码中,@NullMarked应用于整个方法声明,意味着该方法内部的所有类型使用(如参数list和toRemove)若未特别标注,则默认不可为null,除非显式使用@Nullable // @...v2.0.0..."); } 当客户端请求 API 时,若 v 参数值与 version 定义的值匹配,则该接口会被调用。...例如: 访问 /api/query?v=1.0.0,返回 query api v1.0.0... 访问 /api/query?v=2.0.0,返回 query api v2.0.0...
相信熟悉 OKHttp 的同学都知道,OKHttp 内部是使用拦截器来完成请求和响应的,利用的是责任链设计模式。所以可以说,拦截器是 OKHttp 的精髓所在。...使用 Retrofit 比较多的同学肯定会条件反射出以下代码: @FormUrlEncoded @POST("/mobile/login.htm") Call login(@...假设现在我们有如下需求:在上面的 login 接口基础上,后台要求我们传过去的请求参数是要按照一定规则经过加密的。...还是后台需求,login 接口返回的数据也是经过 AES 加密的。所以需要我们针对所有响应体都做解密处理。 另外,还有很重要的一点,就是数据正常和异常时返回的 JSON 格式不一致。...重要的说三遍!!! 再说最后一遍,再见!!! 00:03 References 如何使用Retrofit请求非Restful API
Retrofit的使用 通常我们是Retrofit是和Rxjava配合使用,这里我们不做用法上的过多研究,主要看原理,所以下面的代码都是Retrofit的自身API,没有用Rxjava。...接口 private volatile static API aPI = null; public static API createAPI() { if (aPI == null...所以到这里我们还是不知道adapterFactories是干嘛的,但是我们看到了这个类里面有enqueue方法,还有一些处理响应的一些方法,所以我们可以知道它的作用是处理请求和响应,具体的用法后面继续看源码可以看到...的核心,使用动态代理来处理我们在接口中定义的方法。...进行请求和响应的解析,将json字符串转换为具体的实体类 callAdapterFactories 请求和响应的具体处理适配器工厂数组,这里没有传的话默认为ExecutorCallAdapterFactory
相信绝大多数的 Android 开发者都有使用过的经历。其 restful 风格的编程俘获了众多人的心。 废话就不多讲了,下面就要对 Retrofit 进行源码解析。...本文解析的 Retrofit 基于 v2.3.0 ,GitHub 地址:https://github.com/square/retrofit Retrofit 使用方法 直接抄官网的: 第一步,声明 API...总结起来就一句话:就是将 API 接口中的方法进行解析,构造成 ServiceMethod ,交给下面的 OkHttpCall 使用。...基本上做的事情就是: 创建 CallAdapter ; 创建 ResponseConverter; 根据 API 接口方法的注解构造网络请求方法; 根据 API 接口方法参数中的注解构造网络请求的参数;...使用了装饰者模式把 retrofit2.Call 又包装了一层。
,除此之外这两个网络请求都需要传入 一个Class对象表示响应的Json数据对应的Model,以便在内部使用Gson来解析,以及网络请求的异步回调 NetCallback 我们不直接使用OkHttp提供的...通过简单的一个实现,我们成功验证了使用注解加动态代理的方式实现一个声明式的网络请求框架是可行的,那么后续我们需要继续完善这个项目,提供对更多请求方式 以及参数的支持 对于其他请求方式的支持,我们可以添加更多的表示请求方式的注解...Call对象,而Call对象从使用上来说,目前还是有些繁琐,原生的Call对象返回的是ResponseBody还需要开发者自己处理并做转换。...TodayGankResponse todayGank(); } 也许我们可以在框架内部通过判断方法的返回类型是不是Call对象,如果不是,就在框架内部直接同步调用网络请求得到响应的Json内容后直接转换成...= NetCall.class) { return null; } //要求开发者方法的返回类型必须写成 NetCall 或者NetCall
但是在某些情况下,用户可能需要自定义OkHttpClient,这个时候,可以在接口上定义返回类型是OkHttpClient.Builder的静态方法来实现。...扩展注解式拦截器 有的时候,我们需要在拦截注解动态传入一些参数,然后再执行拦截的时候需要使用这个参数。这种时候,我们可以扩展实现自定义拦截注解。...=false关闭 同步执行http请求,将响应体内容适配成接口方法的返回值类型实例。...如果方法的返回值类型为Retrofit.Response,则可以使用该适配器。 Retrofit自动根据方法返回值类型选用对应的CallAdapterFactory执行适配处理!...将响应体内容适配成CompletableFuture对象返回 Void: 不关注返回类型可以使用Void。
但是在某些情况下,用户可能需要自定义OkHttpClient,这个时候,可以在接口上定义返回类型是OkHttpClient.Builder的静态方法来实现。...扩展注解式拦截器 有的时候,我们需要在拦截注解 动态传入一些参数,然后再执行拦截的时候需要使用这个参数。这种时候,我们可以扩展实现自定义拦截注解 。...=false关闭 同步执行http请求,将响应体内容适配成接口方法的返回值类型实例。...如果方法的返回值类型为Retrofit.Response,则可以使用该适配器。 Retrofit自动根据方法返回值类型选用对应的**CallAdapterFactory执行适配处理!...>: 将响应体内容适配成CompletableFuture对象返回 Void: 不关注返回类型可以使用Void。
Retrofit 对 Kotlin 协程suspend函数的支持是通过动态代理、字节码参数分析和协程挂起机制实现的。...= null -> continuation.resume(body) // 成功返回数据 response.isSuccessful && body == null...在KotlinExtensions.await()的实现中,似乎没有直接使用传入的continuation参数。.../catch捕获 6、完整执行流程 7、与标准协程API的交互 Retrofit 的实现本质上是将回调转换为协程挂起: // 伪代码:等效实现 suspend fun Call.awaitCustom...Kotlin 标准协程 API 取消传播:通过 CancellableContinuation 实现取消联动 线程安全:自动处理线程切换 异常透明:保持协程的异常传播机制 通过这种实现,Retrofit
retrofit.png PS:该图不是我画的,网上盗来的 这张图完美的诠释了Retrofit的整个流程图 首选创建Retrofit,配置响应的参数,然后Retrofit会的的请求都会交给OkHttp...Retrofit内部使用了动态代理,方便了使用,通过retrofit.create返回的其实是一个动态代理类,所有具体的逻辑处理交给ServiceMethod来进行处理。...所以我们把整个流程分解为5大部分 1、Retrofit初始化 2、发起网络请求 3、执行请求 4、处理响应 (一)、Retrofit初始化 具体代码如下: .baseUrl(API_URL...使用缓存的目的是,由于反射比较消耗性能,所以为了避免这种性能消耗,我们保证同一个接口(api)的同一个方法,只会创建一次,由于我们每次获取的接口(api)实例都是传入的class对象,而class对象是在进程内单例的...,会直接抛异常,比如你方法注解使用了@Multipart,但是在参数那里使用了注解Field,由于是互斥的,所以会抛异常。
但是在某些情况下,用户可能需要自定义OkHttpClient,这个时候,可以在接口上定义返回类型是OkHttpClient.Builder的静态方法来实现。...扩展注解式拦截器 有的时候,我们需要在拦截注解 动态传入一些参数,然后再执行拦截的时候需要使用这个参数。这种时候,我们可以扩展实现自定义拦截注解 。...=false关闭 同步执行http请求,将响应体内容适配成接口方法的返回值类型实例。...如果方法的返回值类型为Retrofit.Response,则可以使用该适配器。 Retrofit自动根据方法返回值类型选用对应的CallAdapterFactory执行适配处理!...将响应体内容适配成CompletableFuture对象返回 Void: 不关注返回类型可以使用Void。
但是有人说在Android中已经有很多异步操作的API,比如Handler,AsyncTask等,这些都能满足基本的异步操作,为什么还要使用Rxjava呢? ...当然retrofit最适合的还是REST API类型的接口,方便简洁。 下面我们就看看retrofit的核心工作是如何完成的!...,和参数,并返回我们需要的返回值。 ...} 直接返回参数,也就是OkHttpCall的对象。...大神的代码,对于Android想要进阶的同学来说很有好处,不仅教会我们如何设计代码更多的是解决思想。
本篇文章将介绍笔者在项目中对Retrofit的封装。 先来看一下封装过后的Retrofit如何使用。...生命周期 如何使用封装 小结 一.服务器响应数据的基类BasicResponse。...其中code为服务器返回的错误码。我们会事先和服务器约定成功时的code值,比如200表示请求成功。但通常在请求服务器数据过程中免不了会出现各种错误。例如用户登录时密码错误、请求参数错误的情况。...此时服务器会根据错误情况返回对应的错误码。一般来说,我们只关心成功时即code为200时的content数据。而对于code不为200时我们只需要给出对应的Toast提示即可。...例如没有网络、请求超时或者服务器返回了数据但在解析时出现了数据解析异常等。对于这样的情况我们也要进行统一处理的。
,并不是凭空的去翻译API, 大都是自己亲自使用过后总结出的经验,再来一步步的构思去写,好的博客,笔者认为首先要构思清晰,由浅入深,再总结回顾,最后恍然大悟!...这个方法是所有HTTP工作发生的地方,以满足请求和响应的需求。 拦截器可以有多个,假设同时拥有一个压缩拦截器和一个校验拦截器:需要确定数据是否已压缩,然后对数据进行校验,或者校验和压缩两者一起使用。...网络拦截器 能够对重定向和重试等中间响应环节进行操作。 不会调用缓存的数据来结束网络。也就是说即使有缓存有会去调用Http的请求。 用来监视整个请求和返回的数据。...这通常比重写请求头更加有杀伤管力,因为可以篡改,违反了web服务器的本身返回数据的本意! 在特殊的情况 需要修复容错服务端的返回的数据,重写返回的Head是解决问题的有效方式。...处理返回拦截 使用者都知道我们每次进行一次请求调用call.execute() ,真正的response也在这里开始,拦截器也从这方法为导火索。
,既然请求可以转化,那么响应的返回值转化也应该在这里做。...我简单的翻译一下: 通过调用Retrofit的方法向web服务器发送请求并返回响应。...参数 是成功的响应体类型 看下他的方法 ? 方法.png 和大家设计的一样吗?...再来看下他两个方法的注释 2、看下他的Type responseType()方法的注释 返回此适配器将HTTP响应body转换为Java对象时使用的类型。...(三)、面向接口的优势: 1、方便程序使用多态 例如有方法需要一个集合类型的参数,将参数设置为List类型和设置成ArrayList相比,入惨不仅可以传入ArrayList类型还可以是LinkedList
却使用参数注解@Field,则抛出异常 if (!...return new ParameterHandler.Body(converter); } //如果上面都处理,则说明使用了一个非Retrofit的的注解,返回null...return null; // Not a Retrofit annotation. } 内容如下: 主要是根据具体的参数注解类型,然后具体处理。...如果你想动态设置url,第一个入参需要使用@Url 注解来实现。可以在方法参数里面使用@Path注解,是实现替换Url部分内容,被替换的部分需要用大括号“{}”括起来,例如"{foo}"。...默认情况下,这个方法返回一个代表HTTP请求的Call对象,里面的泛型是响应体的类型,由 Converter.Factory对象负责转化,也可以用ResponseBody代表原始数据,当然你不关心请求体
Retrofit是由Square公司出品的针对于Android和Java的类型安全的Http客户端,如果看源码会发现其实质上就是对okHttp的封装,使用面向接口的方式进行网络请求,利用动态生成的代理类封装了网络接口请求的底层...,其将请求返回javaBean,对网络认证 REST API进行了很好对支持此,使用Retrofit将会极大的提高我们应用的网络体验。...更多关于REST的介绍:什么是REST - GitHub讲解的非常详细 2.0与1.9使用比较 如果之前使用过Retrofit1,会发现2.0后的API会有一些变化, 比如创建方式,拦截器,错误处理,转换器等...//主要用于响应体的处理,Factory中默认实现为返回null,表示不处理 @Override public Converter返回builder是为了方便我们设置baseUrl的,我们可以动态创建多个api接口,当然也可以用@Url注解。
'com.squareup.retrofit2:retrofit:2.0.1' 项目中使用样例 定义HTTP API使用接口 javapublic interface GitHubService {...可以使用不带参数的url @GET("users/list"),也可以使用带参数的url @GET("users/list?...通过在Retrofit创建时生成的Converter再将OkHttp返回的数据进行类型转换得到自己需要的数据。...现在Rxjava响应式编程已经广泛应用,在使用Retrofit时也会结合RxJava使编码更加简单、高效。 一张图简单描述一下Retrofit的工作原理: ?...总结 现在随着Rxjava响应式编程越来越多的程序猿使用,自己也开始接触和使用。