.今天我就带大家来看一下Retrofit究竟是如何使用,以及内部工作原理 一.概述 作用 OKHttp 做的更加简洁,更加方便,同时影藏了oKHttp的某些功能。...type-safe retrofit是基于okhttp的,因此retrofit所有的工作都是围绕在请求体和响应体来展开的,Retrofit提供了各种类型的转换器以及可以自定义转换器,去构建你的请求体...,以及通过转换器去序列化响应体为你想要的类型,从而保证你的请求体和响应体都是安全的 二.使用 1....,将标注及参数生成OkHttp所需的Request对象。...面试题分享 Retrofit请求参数说明 Retrofit中的设计模式 1.
相信熟悉 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。
但是在某些情况下,用户可能需要自定义OkHttpClient,这个时候,可以在接口上定义返回类型是OkHttpClient.Builder的静态方法来实现。...扩展注解式拦截器 有的时候,我们需要在拦截注解 动态传入一些参数,然后再执行拦截的时候需要使用这个参数。这种时候,我们可以扩展实现自定义拦截注解 。...=false关闭 同步执行http请求,将响应体内容适配成接口方法的返回值类型实例。...如果方法的返回值类型为Retrofit.Response,则可以使用该适配器。 Retrofit自动根据方法返回值类型选用对应的CallAdapterFactory执行适配处理!...将响应体内容适配成CompletableFuture对象返回 Void: 不关注返回类型可以使用Void。
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,由于是互斥的,所以会抛异常。
,并不是凭空的去翻译API, 大都是自己亲自使用过后总结出的经验,再来一步步的构思去写,好的博客,笔者认为首先要构思清晰,由浅入深,再总结回顾,最后恍然大悟!...这个方法是所有HTTP工作发生的地方,以满足请求和响应的需求。 拦截器可以有多个,假设同时拥有一个压缩拦截器和一个校验拦截器:需要确定数据是否已压缩,然后对数据进行校验,或者校验和压缩两者一起使用。...网络拦截器 能够对重定向和重试等中间响应环节进行操作。 不会调用缓存的数据来结束网络。也就是说即使有缓存有会去调用Http的请求。 用来监视整个请求和返回的数据。...这通常比重写请求头更加有杀伤管力,因为可以篡改,违反了web服务器的本身返回数据的本意! 在特殊的情况 需要修复容错服务端的返回的数据,重写返回的Head是解决问题的有效方式。...处理返回拦截 使用者都知道我们每次进行一次请求调用call.execute() ,真正的response也在这里开始,拦截器也从这方法为导火索。
本篇文章将介绍笔者在项目中对Retrofit的封装。 先来看一下封装过后的Retrofit如何使用。...生命周期 如何使用封装 小结 一.服务器响应数据的基类BasicResponse。...其中code为服务器返回的错误码。我们会事先和服务器约定成功时的code值,比如200表示请求成功。但通常在请求服务器数据过程中免不了会出现各种错误。例如用户登录时密码错误、请求参数错误的情况。...此时服务器会根据错误情况返回对应的错误码。一般来说,我们只关心成功时即code为200时的content数据。而对于code不为200时我们只需要给出对应的Toast提示即可。...例如没有网络、请求超时或者服务器返回了数据但在解析时出现了数据解析异常等。对于这样的情况我们也要进行统一处理的。
,既然请求可以转化,那么响应的返回值转化也应该在这里做。...我简单的翻译一下: 通过调用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代表原始数据,当然你不关心请求体
只支持将HTTP的响应体转换换为ResponseBody, 这也是什么我在前面的例子接口的返回值都是 Call, 但如果响应体只是支持转换为ResponseBody的话何必要引用泛型呢, 返回值直接用一个...第3节介绍的Converter是对于Call中T的转换,而CallAdapter则可以对Call转换,这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit...其它类型的Converter,如果不能处理返回null // 主要用于对响应体的处理 public Converter<ResponseBody, ?...// Retrfofit对于上面的几个注解默认使用的是调用toString方法 public Converter<?...) { return StringConverter.INSTANCE; } //其它类型我们不处理,返回null就行 return null; } } 使用Retrofit.Builder.addConverterFactory
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<ResponseBody, ?...,这里返回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响应式编程越来越多的程序猿使用,自己也开始接触和使用。
对于 JSON ,通常使用Gson ,但是可以添加自定义转换器来处理 XML 或其他协议。Retrofit 对 HTTP 请求使用 OkHttp 库。...:okio:1.8.0' // Retrofit api 'com.squareup.retrofit2:retrofit:2.7.0' // Gson 服务器数据交互 api 'com.google.code.gson...但细心观察发现,第一步 Retrofit 的实例化过程,只要服务器不换代码几乎是不变的,所以我们完全可以将它封装 而且大家有没有发现,如果单单使用 OkHttp 我们的返回值是一个 Response...,他返回的直接就是一个 Call 对象 发送请求 请求分两种 同步的和异步的 由于请求是耗时的,假设我们发送同步请求 ,在请求就过返回之前,应用界面会进去阻塞状态 说白了就是会卡,甚至卡死。。。...,但 Retrofit 的好处并不只是这些,还有很多跟深入的只是需要了解,但本文限于篇幅,无法向大家一一介绍 对于我前面的 FIWKeepApp 这个仓库,我将一步步转换到 Retrofit + OkHttp
请求 当然这个请求不单单是发送请求这么简单,它包括请求相关的一系列配置是否简易、发送模式是否灵活切换、请求头信息是否易处理、请求参数是否易操作等等 响应 一个好的网络请求框架肯定需要提高我们的生产力,保证我们程序的健壮性...容易转换成不同需求的实体 是否能返回不同类型的结构。...后面出现Retrofit ,将OkHttp3 进行了封装,将请求API 接口化,将返回的数据结合GSON等各种转换器转换为直接面向开发的对象,大大的提升了我们的开发效率,为了解决Android UI/子线程...负责的功能场景方便切换,大家开始结合了RxJava, 这一操作直接将Retrofit + OkHttp3 + RxJava 组合的网络框架推上了热门写法, 现状 kotlin 的出现是Google 对于...= Resource(Status.LOADING, data, null) } } 2.3 使用Retrofit 创建API 接口、接口帮助类 将接口管理和请求放在不同的类文件中,方便管理 API
领取专属 10元无门槛券
手把手带您无忧上云