个人一直从事Java服务端开发,如今已经是移动端的天下,几乎每一个C端的项目应该都是前后端分离的,或APP native开发,或H5 web开发,小程序、公众号开发,这些基本都是前后端分离的项目,也就是需要服务端同学开发API即可,不需要关心前端相关技术栈了,也可以说是技术工种的再一次细分。
那么作为一个服务端开发人员,开发API接口需要哪些知识呢?个人觉得可以从两个角度来看:
自己公司产品开发API
给第三方开发API,也叫OpenAPI、开放API,很多大公司都有自己的开放平台
个人认为只有开发好了自己公司的API,才有资格或者有能力开发好开放API!
那么从开发自己公司API开式,个人觉得需要以下知识点:
响应时间要快“天下武功,唯快不破”,一个好的API接口响应时间一定要快,多快算快?没有最快,只有更快!一般公司会要求所有API响应时间不得超过100ms,高并发API再单独要求,例如不得超过40ms,且吞吐量超过3000tps!
返回的数据格式要稳定相信做过API开发的同学一定有经验,由于序列化方式的不同,有时候一个字段没有值的时候可能会返回如下三种情况:
这个字段在返回的json串里没有了;
这个字段返回的是一个null;
这个字段返回的是一个空字符串。
如果你是前端的话,每个接口规则都不一样,你头大不大?是不是代码里到处都充斥着
if(id && id != null && id != )这样的判断代码?一不小心忘记处理了,然后APP的奔溃率就上来了。
文档要清晰标准一个好的API一定要有一个好的文档,API是灵魂的话,文档就是肉体以及华丽的外表,每一次对接口的更新都要及时反馈到文档上去并且及时的告知前端开发人员。我平时常用的就是把API文档写在wiki上,固定好一个API文档模板,大家都按照这个规则去写就好了,这样前后端联调时候对照清晰的文档也会省去很多的沟通成本。切不可因为懒得写文档,觉得联调时候沟通充分就可以了。你要知道随着时间的推移,这个API很可能就被你忘了,或者接手的同事也无从下手。所以一定要有一个清晰的文档!
那么在此基础上如何开发一个优秀的开放API呢?个人认为这个大家其实都知道怎么一回事,因为即使你没写过openAPI,你还没调用过openAPI吗?微信支付、支付宝支付、极光推送、IM、友盟、OCPC、客服等等第三方应用都需要咱们调用他们的API,看过别人怎么玩的,咱自己照抄就好了。还有一点想要说的就是:“把握好自己的需求,千万不要过度设计!”
这里没有说具体的技术,实际上把以上工作做好了,关于技术这些自然也就好了,细节注定成败,大家认为开发一个好的API最重要的事情是什么?欢迎评论区留言讨论~
我是【java架构设计】,关注我,持续为您提供优质内容!
(1)公主连结wiki:
签名基本原理是通过 key/secret 的实现:1, 服务器负责为每个客户端生成一对 key/secret ( key/secret 没有任何关系,不能相互推算),保存,并告知客户端。
2, 当客户端调用 api 时,根据某种规则将所有请求参数串联起来并用 secret 生成签名 sign 。
3, 将 sign 和 key 一起放进请求参数对服务器进行调用。(注意 secret 不要传)
4, 服务端收到请求,根据 key 去查 secret ,然后用同样的算法,验证签名。
5, 为避免重放攻击,可加上 timestamp 参数,指明客户端调用的时间。服务端在验证请求时若 timestamp 超过允许误差则直接返回错误。
---------------------------------------------------------------------------------------------------------
签名算法过程:
1.对除签名外的所有请求参数按key做的升序排列,value无需编码。
(假设当前时间的时间戳是12345678)
例如:有c=3,b=2,a=1 三个参,另加上时间戳后, 按key排序后为:a=1,b=2,c=3,_timestamp=12345678。
2 把参数名和参数值连接成字符串,得到拼装字符:a1b2c3_timestamp12345678
3 用申请到的appkey 连接到接拼装字符串头部和尾部,然后进行32位MD5加密,最后将到得MD5加密摘要转化成大写。
示例:假设appkey=test,md5(testa1b2c3_timestamp12345678test),取得MD5摘要值 C5F3EB5D7DC2748AED89E90AF00081E6 。
------------------------------------------------------------------------------------
总结:
接口调用方和接口提供方约定好统一的参数加密算法
接口调用方在调用时把加密后的_sign放在参数中去请求接口
接口提供方接到响应后,判断时间戳是不是在有效时间内(这个时间间隔根据你的安全范围可以是10分钟,5分钟,20秒等,过期失效,前提是需要保证接口提供方和调用方的服务器时间为准确的网络同步时间)
把参数中除了_sign以外的参数进行加密,然后把加密结果和传过来的_sign比较,相同则执行调用请求。
md5加密