(废话一句)
如果你颜值超高,你可以慢慢秀自己,然后在展示才华;
如果你矮而穷挫,赶紧秀智商,否则没人有耐心看你卖骚
so……
在我的公众号没内涵之前,直接说主题(否则没人看完文章的): LBS系统的接口是怎么写的
总结、LBS接口的几点特长:
1、用枚举当成方法名,通过switch和路由方式内部分发,只有一个对外接口
2、用json做参数传入和传出
3、用http的post方式实现接口调用,而不是WebService
4、用http的post方式,理论上可以支持java/php/asp/asp.net等开发语言的系统的接入
5、通过http的post方式,走网页的80端口,桌面软件客户端不需要安装Oracle数据库
6、接口不使用WebService的另外一个优点,参数传入版本号,可以通过版本号做对应的版本适配,避免应用程序在Server端某些局部更新需要做不必要的频繁升级。(本接口暂不实现,但预留这个扩展)
7、接口代码用partial分割,逻辑模块按目录和文件名归类和创建,避免接口逻辑扎堆写在一个cs文件上,难以代码查找和定位
8、各种装逼的安全考虑和设置
9、通过代码工具,定义了接口枚举,逻辑名和名空间后,代码工具刷出接口框架,然后对应补上逻辑代码。
10、(怕别人不看下面的内容,把总结提前了)
一、LBS系统目前是结构:
1、Oracle数据库:存储数据
2、一个桌面软件:展示数据
3、一个Web系统:调取Oracle的数据给桌面软件
二、LBS系统的接口是啥
(在Web系统里面实现)
1、一个WebServic页面:不对
2、一个Handler页面:不完全对
3、一个基于XML格式的Handler页面:(答案)
三、接口该满足啥要求?
1、安全:总要加密或鉴权一下吧?!
2、防攻击:别人模拟请求做重放攻击,如果接口每次都要读取数据库做逻辑判断,绝对会被人撸死!!
3、跨平台:(吹)可以支持.net/java/php/asp等,不然.呵呵。
四、我怎么处理三的?
1、安全:接口参数后面带两个参数:
dt:时间戳,如果时间超过1分钟(配置文件设置),则请求无效;
sign:MD5签名。签名方式MD5(参数+dt+用户登录密码+共享密钥),如果请求过来的参数,生成的MD5签名不等于sign,判定为非法请求。
2、防攻击:
(1)时间戳限定时效性(小杂碎兵)
(2)用户密码:服务器缓存(避免读写数据库)
(3)MD5鉴权:判断有效来源
(4)参数串整体加密:这事我暂时不干(系统可以这样设计)
3、跨平台:用XML和Json做数据通信
五、为什么签名参数要用用户登录密码
1、装逼,显得专业;
2、因为系统肯定要设计用户权限,所以要带上用户ID做鉴权,用户ID必须附上用户密码判断是否是真实有效的用户ID请求;
3、因为共享密钥的存放方式有问题:
(1)桌面软件也需要设置共享密钥,但不能固化在系统里一个值,不能配置和修改
(2)桌面软件的共享密钥是软件内置DES3加密后存放在配置文件里面的
(3)总有刁民(理论上)会拿到共享密钥:反编译LBS加密程序,拿到DES3的加密算法,反算出共享密码。
所以:
假如我不做LBS系统了,又想黑LBS系统,如果接口设计中没有追加用户登录密码的鉴权,我只要拿到共享密钥(另外一个条件:可以访问接口的Web页面),完全能把系统给黑了。
而如果追加了用户登录密码,而用户登录密码是用户登录系统时候输入的,我无从知道,就没法通过接口攻击系统了。
六、接口怎么管理和规范
1、如果一个系统有250+个接口,你要分类不?如果不分类,代码全部写在一个cs类里面,那个代码文件将很庞大和难以管理。
2、接口升级是否应用要跟着升级?!
3、一个简单接口加多一个字段输出,应用就要全盘升级?!
答案:
1、用枚举来管理
2、通过路由和partial将代码分块和分目录管理
2、接口参数有附带应用的版本号,通过版本号做相应的内部逻辑适配(除非有些逻辑必须升级才能应用)
七、LBS系统的主要工程
分成三部分:
(一)公共部分1、eKing.Enum4Gps:放系统相关的枚举
主要是:
EmWebCallMethod(看图少说话)

(通过枚举定义接口)

(设置哪些接口不需要参与用户登录密码的校验)
2、eKing.GpsCoreLogic:
核心逻辑,多个应用可以都有调用。功能有
(1)电子围栏报警判断
(2)任务到位和完成智能判断
因为这个逻辑,几个地方用
(1)桌面软件端
(2)后台服务端
为了避免代码重复编写,dll封装成一个模块
3、eKing.GpsDataInfo:
接口的相关逻辑类
(1)HandlerParams.Call:
放接口的请求参数
(2)HandlerParams.Result:
放接口的返回结果值
(3)MethodParamsInfo:
与Call互相转换,满足请求参数变化的时候,代码修改的地方尽可能少。
(这种模式:请求参数变化,需要改Call、MethodParamsInfo)
(二)Web部分
1、引用公共部分的所有DLL
2、eKing.XlyLib:
框架代码,构建数据表的逻辑类

3、eKing.GpsDataUtil:实现接口的所有逻辑
4、Web:提供数据服务给桌面软件
(三)桌面软件部分
1、引用公共部分的所有DLL
2、eKing.GpsApp:桌面软件逻辑代码
因为他没有调用直接访问数据库,而是通过Web的接口访问数据库。
所以桌面软件的部署:
(1)不需要安装Oracle客户端
(2)对服务器的访问要求只需要开通80端口即可。
八、代码工具
干啥咧:
就是把接口的框刷出来,然后你在根据需要改属性参数和逻辑代码

九、程序实现流程
以:“获得基础数据燃油”为例子:
桌面软件端实现:
1、调用获得数据的代码写法:

2、ah.EkBasicOilDataInfoList的实现

(代码结构树-用partial将AppHelper类根据接口和目录结构分块)
(1)避免单个cs文件代码过长
(2)跟Info、Util的dll的目录结构对应,便于快速定位代码



(1)ServerTimeSpanCheckSet():因为服务器的时间和本地电脑时间会有误差,首次调用时候把服务器时间和本地时间的时间差计算好(仅调用一次)
(2)EkBasicOilDataInfoListMP和EkBasicOilDataInfoListCall做逻辑转换
A.MP中,时间是DateTime格式,Call中时间是yyyyMMddHHmmss个文本格式,避免编码问题。
3、附上GpsCall的主要代码




4、附上:HttpPostXmlData代码


Web端实现:




其中,调用ut.GpsCall(emWebCallMethodV, str);实现路由分发。
eKing.GpsDataUtil 最终实现逻辑
(目录树)


相关的片段代码



对应的处理逻辑:
ah._EkBasicOilDataInfoList






十、相关的定义
枚举定义:

Result定义:



Call定义:



MP(参数方法)定义:




(长按二维码求关注)




