暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

(霜叶原创)LBS系统的接口设计

看代码 2016-07-21
361

(废话一句)

如果你颜值超高,你可以慢慢秀自己,然后在展示才华;

如果你矮而穷挫,赶紧秀智商,否则没人有耐心看你卖骚

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(参数方法)定义:


(长按二维码求关注


文章转载自看代码,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论