Ktor能写服务端我想很多人都已经知道了,但是由于国内的后端开发基本都不会去用Kotlin语言写服务端,所以Ktor server在国内的普及就不是很广泛,最多只是当作一个技术调研来学习知道一下就好了,那么它是不是真的一点用处也没有呢?不是的啊,至少我觉得它能够帮助我们Android开发解决一些日常开发中的一些小问题,本篇文章就当作是一个经验分享吧,讲讲我是如何把Ktor Server当成是一个辅助工具的
装包
很多人肯定会诧异,心想着装包有啥稀奇的,基本学Android第一天就知道怎么装包了,连个数据线,Studio里面run一下,apk包就自动装到测试机里面了,再不行,本地打个包出来,直接扣扣vx发过去让对方安装一下就好了(本文暂时忽略打包平台,因为各个公司的打包平台都不一样,有的公司甚至没有打包平台,所以不考虑这些),没错,正常情况下我们都是这样做的,但是不知道有没有遇到过这样的情况
- 恰好测试机里面没有安装任何通信工具,无法通过传送apk包的方式安装应用
- 在1的前提下,手头刚好没有数据线,无法连接自己的电脑run一个包,或者adb install/push一个包到测试机里
- 就算2可以实现,但是你自己必须亲自给需要装包的人一个个安装,人一多就非常耽误时间,或者刚好在开会或者被其他事情耽搁了,不方便第一时间给别人装包
- 以上都是debug包,基本使用手头当前分支的代码就能构建出来,但是如果需要一些历史的生产版本验证一些问题或者看一下某一个突然出现的bug是在哪一个版本中出现的,咱是不是要一个个分支切换,然后逐个构建个生产包出来验证呢?
这些问题在一些公司里暂时没有打包平台的小伙伴身边经常会发生,就算有打包平台,万一运维的大佬们不小心把平台搞挂了,也一样用不了,那么这里就衍生出了一个问题,到底有没有一种稳定的,快速的,高效的方式来安装apk包 ,比如别人想要安装某个版本的debug包或者生产包,你直接扔个链接或者二维码给他,让他通过手机自带的浏览器访问或者扫一下就可以把安装包下到手机本地了,这样是不是方便很多呢?要做到这一点,很简单,首先我们创建个ktor server项目,不知道如何创建ktor server项目的,可以通过我的这篇文章了解一下,现在打开创建好的ktor server项目,在resources文件夹下新建个文件夹,就命名为apk,表示这个文件夹下就是存放apk的静态资源的
然后就是去Routing.kt
文件里面去配置一下这个新建的静态资源目录,配置的方式很简单,一行代码搞定
最后一步,就是在Application.kt
文件里面配置一下自己的本地ip就可以了
这样我们apk的资源配置就完成了,接下来就是在刚刚新建的apk文件夹下放入apk安装包,这边为了演示,就随意找了个项目run个包出来,大家到时候直接用自己项目的安装包就可以了,这边将编译出来的debug包复制了一份到server项目中的apk静态资源文件夹下
这个时候咱们再运行一下ktor server项目,那么这个app-debug.apk包就可以通过 http: //你的ip:你的端口/app-debug.apk 这么一个路径访问到了,现在测试下,运行一下项目后将apk的路径输入到浏览器里面
我们这个apk文件就被下下来了,由于装包是用手机去安装,所以我们可以去找个二维码生成器,将上述apk的路径转换成二维码,将二维码图片发给任何想要装包的人,那么对方只需要使用测试机里面的浏览器自带的扫一扫功能就能完成装包了,作为开发者的你花不了多少时间又可以处理自己的事情了,目前我个人已经使用这种方式来存放每一次上线后的apk包,并且因为这个,处理过一个历史遗留问题,定位到该问题是在哪个版本出现的,并找到了对应时间的提交记录
Mock Server
每个前端开发应该都会有一个用的顺手的Mock工具,一个好的Mock工具可以帮助前端开发在跟后端联调前就可以完成本地的一些页面调试,比如ui界面调整,模拟弱网环境或者网络异常情况下的兼容处理,那么ktor server就完全有能力做到这一点,下面以一个常见的场景作为例子来演示下如何用ktor server来写Mock
需求
比如你正在开发一个金融项目,有个需求说要按照用户不同的状态比如已开户,已绑定银行卡,身份证已过期,来展示不同的文案,这个状态肯定是服务端从某个接口里面传给你的,但是你自己是需要所有状态来验证一下自己的文案展示是否正确,而服务端在自己的开发环境改变状态的话,可能会涉及到若干个表的同时修改比较麻烦费时间,这个时候你可能就需要在本地的Mock Server里面调试这些状态了
写本地接口
我们继续用上面创建好的ktor server项目,在configureRouting
函数中同样写一个获取用户状态的接口,注意这个接口的path一定要跟你实际项目中所mock接口的path一致
这里直接将UserInfoModel
作为Response给传回了客户端,当然也可以按照接口规范包上一层code和message,运行一下项目后,我们本地的这个接口服务就启动了
客户端请求
现在项目网络请求一般都是用的OkHttp+Retrofit的模式,所以我们在自己的客户端项目中也配置上这些插件
然后将网络层的配置代码加上
这种代码现在已经烂大街了,我这里简单的配置下,主要是设置baseUrl
部分,我们看到这里默认是以DEV_BASE_URL
作为我们的地址,这个地址基本每个项目都有,表示对应的当前服务端域名,创建我们Retrofit
的时候默认请求域名就指向了DEV_BASE_URL
,然后将请求用户状态的接口加上
再是调用这个接口的代码,先暂时用服务端的域名请求
好了以后我们在页面中加上一个按钮和一个文本,点击按钮后发送请求,将请求后的结果显示在文本上,代码如下
可以看到除了正常返回数据之外,其他情况都会在文本上展示网络异常字样,而我们目前加的这个接口其实就相当于一个服务端正在开发中的接口,并没有部署到我们的开发环境,也就是DEV_BASE_URL
这个地址,所以是请求不到数据的
那么这个时候我们如果想要用这个接口的数据来调整下页面ui或者一些视图逻辑,就必须将这个接口的请求域名切换至我们本地的mock环境,也就是刚才已经启动的服务,这里改下请求接口的代码
在一个完整的项目中,这一行代码的修改说明,我们其他接口仍旧使用我们的开发环境的域名,而需要调试的这个用户状态接口,使用我们的Mock环境来调试,这个时候请求下来的数据就是我们Mock数据
到了这一步,剩下的事情很轻松了,所有需要验证的一些视图逻辑,完全就可以从修改你的Mock server代码来实现,除了刚才说的不同状态需要显示不同文案的逻辑,我们还可以调试下弱网环境下的页面交互,比如加个loading图之类的,正常请求我们的接口响应基本都是毫秒级别的,所以如果想要看下我们loading图会变得很困难,除非改下逻辑代码,将关闭loading图的代码暂时注释掉才行,不过这样的做法是有风险的,万一忘记改回来了,这些代码就很有可能被测试发现给你个bug,甚至是带上生产,现在借助我们的Mock server就不需要这么麻烦了,只需要在接口响应之前加个delay
就可以了
延迟了个五秒后在给数据,轻松模拟了一个弱网环境,接着在页面中我们增加个"正在加载中"的文案作为占位字样,在没有数据返回前都显示的这个占位文案
现在一个弱网环境下的简单交互就完成了,看下结果
以上就是使用ktor server来Mock接口数据的全部过程,看起来应该不麻烦吧
总结
简单的两个小经验分享,一个目的当然是让大家伙知道下,希望能给各位在平时工作中带来点帮助,另一个目的也是让这个在国内偏冷门的框架多一些人了解,尽管写服务端确实issue比较多,但依然能给开发者尤其是Android开发提供些帮助,毕竟都是用Kotlin写的,门槛还是比较低的。