导言 现在虽然是多端平台开发的天下,但做Iot开发主要在安卓系统下,当然不排除以后的什么鸿蒙系统(至于能不能成大器这另一回事)。...传统的就http(s)或MQ这两套板斧,不过其实MQ也是基于http(s),只是由于其已经大多封装好调用直连所以是俺等懒人的必选之一。...Retrofit的优点 ①超级解耦 ②可以配置不同HttpClient来实现网络请求 ③支持同步、异步和RxJava ④可以配置不同的反序列化工具来解析数据,如:json、xml...); //接口对象调用其方法获取call对象 Call data = server.getData(); //call执行请求 data.enqueue(new Callback...(Call call, Throwable t) { Log.e("retrofit", "onFailure: "+t.getMessage());
ip.taobao.com/service/getIpInfo.php") Call getIpInfo(@Query("ip") String ip); } ---- 调用接口...); Call call = apiStores.getIpInfo("220.160.193.209"); //在主线程里,异步调用。...(Throwable t) { Log.i("onFailure", "onFailure=" + t.getMessage()); } }); 同步调用 try {...GET("http://ip.taobao.com/service/getIpInfo.php") Call getIpInfo2(@Query("ip") String ip); 调用接口...(Throwable t) { Log.i("onFailure", "onFailure=" + t.getMessage()); } }); 进阶使用2: 常用接口范例声明
参数分别表示每页数据的数据以及请求的页码,除此之外这两个网络请求都需要传入 一个Class对象表示响应的Json数据对应的Model,以便在内部使用Gson来解析,以及网络请求的异步回调 NetCallback 我们不直接使用...每一个网络接口调用请求的url地址和请求方式都是唯一的 ,那么对于一个简单的网络请求 我们能不能使用 注解 + 动态代理来简化这一过程,改为声明式的编程方式来实现网络调用,比如就像这样 /** *...String value(); } 新建一个处理Http接口类的动态代理的类Retrofit,因为我们实际网络请求的调用是依赖OKHttp,所以我们要求构造函数传入OkHttp对象 目前Retrofit...3.4 实现ConverterFactory 解耦Json转换 在上面的例子中,我们直接在框架Retrofit中使用了Gson库做Json转换,但作为一个框架来说 我们不希望直接强耦合一个第三方Json...框架支持 对方法返回类型的自定义适配,和Converter接口一样的思路,我们在框架可以定义一个 CallAdapter接口,让应用层来具体实现并传入 package retrofit2; import
还不会用Retrofit?少年去看看Retrofit 2.0 的使用吧!!! 源码解析 这里分别说明了都调用了哪些源码,都是怎么实现的。(里面涉及到一些设计模式,什么?你还不知道有什么设计模式?...是Retrofit的一个内部类,用来配置一些成员变量,这里配置了baseUrl和ConverterFactory(对象的序列号/反序列化组件),然后创建一个Retrofit对象。...Retrofit.Builder() 看看new Retrofit.Builder()调用的代码 public Builder() { this(Platform.get());...validateEagerly(标识):先不说,后面会用到 总:完成基本的配置,创建一个Retrofit对象 2.Service的创建以及接口的调用 我们创建了一个接口的实例,用于调用接口。...ServiceMethod的定义:把对接口中的方法的调用转化成一次HTTP调用。 (说人话...) 呃...
介绍 Retrofit是Square公司基于RESTful风格推出的网络框架封装。Retrofit是基于OKHttp的网络请求框架的二次封装,其本质仍是OKHttp。...基于HTTPClient,作者已经停止维护,Android5.0不再使用HTTPClient,因此不推荐使用。 Volley。...使用 //生成接口对象 UserMgrService userMgrService = retrofit.create(UserMgrService.class); 调用接口方法返回Call对象。...同步:调用Call对象的execute(),返回结果的响应体。 异步:调用Call对象的enqueue(),参数是一个回调。...int code1 = response.body().code; } @Override public void onFailure
1.简介 Retrofit对协程的支持非常的简陋。...protected Object adapt(Call call, Object[] args) { call = callAdapter.adapt(call);//如果用户不设置...4.自定义CallAdapterFactory Retrofit在调用后直接进行了网络请求,因此很不好操作。我们把网络请求的控制权放在我们手里,就能随意操作。...处理suspend方法的代码调用,并传进来一个callback,如果你回调了callback.onResponse,那么suspend方法就会成功返回 * 如果你回调了callback.onFailure...{ Log.e("awaitBanner",banner.title) } } /** * 不处理异常
image.png Retrofit是什么 Github地址 Retrofit基于okhttp封装的网络请求框架, 网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装...也支持其他解析工具比如fastJson 实战使用 创建Retrofit请求基础配置 Retrofit.Builder()就是希望你根据不同的业务创建出不同的Retrofit来搭配接口服务使用。.../使用Gson解析 .callbackExecutor(Executors.newSingleThreadExecutor())//使用单独的线程处理 (这很重要,一般网络请求如果不设置可能不会报错...onResponse: message="+bean.getMessage()); } @Override public void onFailure...(Call call, Throwable t) { Log.e(TAG, "onFailure: 网络请求失败="+t.getMessage())
有的时候做项目的时候会遇到调用接口的url和之前接口定义的url不一样,很可能连retrofit已经设置好的baseurl都要换,但是retrofit并没有提供修改baseurl的方法。...retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory...} } @Override public void onFailure...(Call call, Throwable t) { Log.e("onFailure", "onFailure");...= null && headerValues.size() > 0) { //如果有这个header,先将配置的header删除,因此header仅用作app和okhttp
Retrofit 早已不是什么新技术了,想必看到这篇博客的大家都早已熟知,这里就不啰嗦了,简单介绍下: Retrofit 是一个针对 Java 和 Android 的设计的 REST 客户机。..., Retrofit 一直是结合 OkHttp 和 Gson(无所谓什么 JSON 解析器都行,这里就用 Gson 了) 我这里专门找了最新的版本库,so~ 大家直接用即可 别急,前面也说了 Retrofit...如果我们前面设置的是 @GET("login") 那这里 baseurl 就是:http://hyh.hljdx.net:8080/SitUpWebServer/ 是不是一下子就明白了,但是其他博客不照顾新人...(UserMgrService.class); 过于简单,调用前面 retrofit 对象的 create() 方法传入接口的 class 文件即可 获得 Call 对象 由刚开始的代码我们知道 我们向服务器发送请求需要调用...Callback 接口即可 调用后系统自动释放资源,不会阻塞,等到请求结果返回时 就会自动调用 onResponse 方法,方法 里的 response 就是处理好的结果 本文代码运行后结果 Demo
Retrofit,因为其简单与出色的性能,也是受到很多人的青睐,但是他和以往的通信框架还是有点区别,不过放心,因为他本身还是挺简单的,所有我相信你看完这篇文章,对基本的请求是没什么问题的,其实现在网上这样的文章也有很多了...return serviceMethod.callAdapter.adapt(okHttpCall); } }); } 当然,这里不做深入的了解,我们现在就直接去调用我们的接口方法...Call editUser(@Field("id") int id, @Field("name") String name); OK,我们用到的关键字是Field,这样去定义,然后直接调用这个方法...+ RxJava RxJava使用起来会让我们的代码更加的简洁,高效,那他和Retrofit2.0又会碰到什么样的激情呢?...(PostApi.class); 这里我们需要增加addCallAdapterFactory为我们后面的Rx做准备,然后我们调用两次 api.login("liuguilin", "748778890"
Retrofit和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作。同时还封装了网络代码的调用。...statusCode = response.code(); User user = response.body(); } @Override public void onFailure...我们都知道服务器返回的结果一般都是下面这种格式的: image.png 一定是有code状态码和返回信息的,我之前的用法和教程一样,说将服务器返回的结果复制下来直接在AS上面利用GsonFormat...转化就OK了,确实很方便,但是这样下来每个bean里面都会有重复的erroe_code和message或者服务器返回其他,所以我是这样做的: public class BaseCallModel...的CallBack,OnResponse()方法里面去判断网络请求正常的各种情况,onFailure()方法里面则是网络有问题会走该回调。
下面通过源码逐层分析实现细节,重点关注关键类和方法: 1、入口:SuspendForBody.adapt() 方法 // retrofit2.HttpServiceMethod.SuspendForBody...委托给Kotlin扩展函数 return KotlinExtensions.await(call, continuation); } 关键点解析: args 参数数组来自动态代理调用,最后一个参数是...Call.cancel() } 协程取消流程: 当协程被取消时,自动触发此回调 调用 Call.cancel() 中断网络请求 避免资源泄露和无效回调 响应处理流程 when { response.isSuccessful...将传统异步网络请求完美融入 Kotlin 协程体系,使开发者能够以同步方式编写异步代码,同时保持完整的错误处理能力和取消响应能力。...运行时: Retrofit 动态代理拦截方法调用68; 识别 Continuation 参数并分发到 SuspendForResponse/Body; 通过 KotlinExtensions.await
并且Retrofit与异步请求框架和类解析框架解耦,使得Retrofit可以适配多种框架,使用者可以轻松的选择适合自己项目的异步请求和解析的框架。...缺点 不能接触序列化实体和响应数据 执行的机制太严格 使用转换器比较低效 只能支持简单自定义参数类型 使用的设计模式 Builder模式 Retrofit在生成Retrofit对象和ServiceMethod...工厂模式 Retrofit的Converter和Adapter都是由抽象工厂模式来生成的。...和Adapter都是在Retrofit代理各个方法时候生成的。...总结 Retrofit的设计符合了高内聚,低耦合的原则,有效的将其他框架组织起来,并使其之间解耦,这增强了Retrofit的易用性和灵活性。
这样就造成了在学习 Retrofit2 的过程中,对某些参数的作用并不能直观感受到,所以这里我就尝试着用 Nodejs 搭建了一个本地服务器,提供了几个接口用于支持 Get、Post 模式访问调用,支持文件上传和文件下载功能...,返回的数据格式有 Json 对象和 Json 数组,需要的参数格式可以由使用者来自由定义 本篇文章不会对 Retrofit2 的用法进行过多介绍,重点在于介绍服务端接口的搭建以及 Retrofit2...当有正常结果返回时,调用的是 onSuccess 方法,此时返回的数据格式类似于如下所示,返回码 code 固定为 "1",,返回信息 msg 固定为 "success",data 包含实际要返回的数据...引入对 Retrofit2 和 converter-gson 的支持 implementation 'com.squareup.retrofit2:retrofit:2.4.0' implementation.../leavesC/Retrofit2Samples
以下方法不使用可忽略 result.onSuccess { //do something } result.onFailure...} result.onCompletion { //do something } result.onFailure...} result.onCompletion { //do something } result.onFailure...MutableMap { return body }}上述常规封装完成,下面开始优化,我们使用kotlin的扩展方法让repo创建支持dsl,并且能够简化调用...请求结果转换为flow,便于操作//这里我们不处理异常,异常正常抛出即可,接下来通过flow的操作符进行异常处理inline fun Repo.toFlow
最近项目中遇到了下载视频和图片文件的需求(还有上传视频和图片的需求,我会在下篇博客中讲解),我第一反应是用retrofit做呀,so easy!产品接着说,要带下载进度条哦!...我一想,retrofit好像并没有给我们提供显示下载进度的接口,哎呀,看来还是得自己个儿整整喽!接下来,我把自己实现Retrofit带进度下载文件的流程分享给大家。...一、添加依赖 在app的build.gradle的dependencies节点中添加以下代码: implementation 'com.squareup.retrofit2:retrofit:2.3.0...我们分别添加Retrofit、exoplayer和glide的依赖,可能有朋友要问了,“implementation ”这是什么玩意呀?添依赖不是用compile吗?ok!...(); } 回调中包括下载开始、下载进度、下载结束和下载失败等四个方法。
()方法里面和parseParameterAnnotation()方法里面分别解析方法注解和参数注解。...补充说明: 由于是调用无参的Retrofit.Builder()的构造函数,而无参的构造函数内部又调用了 this(Platform.get());在 this(Platform.get())里面有调用了....Call 转化为T (注意和okhttp3.Call 区分开来) ,retrofit2.Call 表示的是对一个Retrofit的接口方法的调用,也就是我们举得例子 Call<List<...loadServiceMethod()方法解析数据,如果缓存中有,直接拿 4、用serviceMethod和args作为参数,构造一个OkHttpCall对象 5、调用serviceMethod的callAdapter...callback.onFailure()方法;如果在请求过程中出现问题则也一样调用callback.onFailure()。
@Inject lateinit var dataSource: DataSource ... 5.对Activity使用@AndroidEntryPoint注解 在Dagger中需要调用...injected) { injected = true; // 调用component的注入方法 ((MainActivity_GeneratedInjector)...implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation "com.squareup.retrofit2:converter-scalars...{ @Binds abstract fun provideCallback(callback: CallbackImpl): ICallback } 4.Activity中注入,并调用方法...() { Log.i("aruba_log", "onFailure") Toast.makeText(context, "onFailure", Toast.LENGTH_SHORT
那我先说我的思路,如果是我,我先想摸清需求 需求如下: 1、首先要解耦,请求和构建请求分离,所以必须在这里"库"里面组建一个Call来和okHttp里面的Call对应 2、有返回值的时候给外部调用的回调...每一次调用都产生自己的HTTP请求和对应的响应 对儿。如果出现了在避免轮询或者失败重试的情况,可以 调用clone()方法 复制 可以对具有相同的web服务器进行 具有相同参数的 请求。...调用 Response的isSuccessful()方法来判断响应是否成功。...可以看到,调用findPlatform()方法之后就回去判断对应的平台,具体实现的子类就是Android 和Java。...A需要调用B的服务,A却不需要去仔细阅读B写的代码,通过接口文档就可以看出对应业务的方法和参数类型,进而使用RMI或者RPC等相关技术实现模块化的调用。而这一切本身就是相面接口编程。