谈一谈API接口开发,怎么编写一个合理严谨的接口
做过开发的法式猿,根本都写过接口,写接口不算难事,与接口交互的工具查对好接口的地址、哀求参数和相应参数即可,我在作为口试官去口试开发职员的时刻,有时刻会问这个问题,但相称多的一部门人并没有深刻的斟酌过怎么写好一个接口,包含接口的靠得住性、平安性和高并发等等。
小编在项目开发进程中,与许多的企业对接过接口,包含一些小企业定制化的软件接口,也包含一些年夜厂形陈规范的接口,好比付出宝、银联、微信,以及各年夜银行等等,相对来说,许多小厂的接口编写比拟随便,而年夜厂对接口的界说就比拟严谨,接下来我们就来阐发一下。

1、api接口署名
有过开发履历的法式猿,一样平常都邑注意到这个问题,为了接口的平安性,必要对参数进行署名,防止参数在哀求进程中被窜改。就相似于你的一个很久没接洽的同伙或者同窗,经由过程微信或者QQ,给你发了条新闻,向你借钱,有一部门人的第一反响是他是不是被盗号了。他是本人吗。以是我们建议经由过程视频或者德律风再沟通核实一遍,这便是为了平安性防止产业的损失。
(1)为什么必要 API 接口署名。
对外开放的 API 接口都邑面对一些平安问题,例如假装进击、窜改进击、重放进击以及数据信息泄露的风险。应用 API 接口署名能便利的防范这些平安问题和风险。在设计 API 接口署名时主要斟酌以下几点:
保证哀求数据正确
当哀求中的某一个字段的值变化时,原有的署名成果就会产生变化。以是,只要参数产生变化,署名就要产生变化,不然哀求将会是一个无效的哀求。
保证哀求起源正当
一样平常环境下,天生署名的算法都邑成对呈现一个 appKey 和一个 appSecret,依据 appKey 能辨认出挪用者身份;依据 appSecret 能辨认出署名是否正当。
这两个参数长短必需的,依据平台的商户定,好比假如平台没有商户的观点或者只有一个商户,像我们常见的本身的客户端对接本身的服务端。然则像一些提供接入才能的平台,好比微信,许多企业都可以接入,那他就必要区分分歧的商户,每个商户分派一个appId,然后再经由过程appKey+appSecret来区分挪用者的权限。
辨认接口的时效性
一样平常环境下,署名和参数中会包括光阴戳,如许服务端就可以验证客户端哀求是否在有用光阴内,从而避免接口被永劫间地反复挪用。
(2)署名实现逻辑
各家在署名时的哀求参数可能有一点差异,但整体实现逻辑是相似的。
第一步:将除sign外的所有哀求参数放入聚拢Map中;
第二步: 将第一步获得的聚拢M中的参数依照参数名ASCII码从小到年夜排序(字典序);
第三步:将第二步中排序后的key和与之对应的value拼接起来,使用URL键值对的格局(即key1=value1&key2=value2…)获得字符串 params;
第四步:在params的末了再拼接appKey密钥,然后经由过程某种加密算法或经由过程hash算法获得 sign 值(一样平常为Base64(HMAC_SHA1(params, appSecret)));
第五步:sign加到params 中,将params放入哀求头中发送哀求目的接口;
(3)署名实当代码
我们会常用到几个参数:
version:版本号
charset :字符编码
sign_type:署名类型,如RSA、RSA2、SHA
timestamp:当前光阴戳,格局YYYYMMDDhhmmss,在服务端会验证比对哀求方的光阴与体系当前光阴差,若超越太多,好比跨越十分钟,就以为这个是过时的哀求,不容许获取数据。
nonce_str:随机字符串,随机以主要保证署名弗成猜测。每次哀求时都纷歧样。
2、加密算法
对付一些比拟敏感的私家信息,接口授输进程最好进行加密传输,好比用户姓名、手机号、身份证号码等。假如必要明文保留,可以使用AES双向加密解密,假如直接保留加密的数据,可以使用md5加密。
(1)md5加密
MD5加密是一种弗成逆的加密算法,弗成逆加密算法的特性是加密进程中不必要使用密钥,输入明文后由体系直接颠末加密算法处置成密文,这种加密后的数据是无法被解密的,只有从新输入明文,并再次颠末同样弗成逆的加密算法处置,获得雷同的加密密文并被体系从新辨认后,能力真正解密。许多网站为了平安性,会额外再加一个盐值(一串随机字符串)一路进行加密,进步加密的平安性。MD5盐值加密作用便是为了防止MD5被暴力破解。经由过程盐值和暗码进行组合计算得出MD5,在数据库中要同时存储该MD5码及盐值。在必要验证暗码正确性时,可以将暗码和数据库中对应账号暗码的盐值组合计算出的MD5与数据库中的MD5进行比对。
另外一些网站号称可以对md5加密的密文进行解密,他们只是手机了足够多的暗码信息,来进行匹配,反向推导出加密前的明文,现实上是无法真正的实现md5解密的。
(2)AES双向对称加解密
AES是一种分组暗码 分组长度为128位(16字节),依据密钥长度可分为AES-128 AES-192和AES-256,密钥长度分歧,AES的加密轮数也分歧。
AES的事情模式分为ECB、CBC、CFB等
ECB是最简单和最早的模式,起首是密钥扩大,将加密的数据依照16字节的年夜小分成多少组,对每组都用同样的密钥加密。
CBC和ECB的区别便是添加了一个初始向量(16字节),在将密钥分成多少组之后,第一组与初始化向量异或之后再进行与ECB雷同的加密流程,后面的每一组都与上一组的密文进行异或之后再与密钥加密。
3、编码解码
(1)为什么会呈现乱码
在计算机中,不管是一段笔墨、一张图片照样一段视频,终极都因此二进制的方式来存储。也便是终极都邑转化为 0001 1000 如许的格局。换句话说,计算机只熟悉 0 和 1 如许的数字,并不克不及直接存储字符。以是我们必要奉告它什么样的字符对应的是什么数字。然则假如用户A界说的编码规矩,传到B使用了另外一套解码规矩进行解码,因为编码息争码的规矩对应不上就导致了乱码。
(2)怎么办理乱码
这就必要我们相识java中的编码转换。两边界说好编码方式,我们以utf8和gbk这两种常见的编码为例。
4、接口token鉴权
有一部门人会把token鉴权和接口加签搞混,我们来梳理一下这两种方式。
使用Sign署名,是为了对接口参数进行验证,我们在营业开发进程中与上下游体系进行接口对接时,常采纳这种方式,那为什么不是token方式呢,由于我们不必要登录上下游体系,他们在拦阻器层面已经放行了这些接口,不必要登录后才给挪用。而像我们治理平台上的接口,好比查询某个列表的数据,就不克不及直接挪用接口,必要先登录体系才有挪用接口的权限。
Token是用来断定用户身份的一个标识,身份验证经由过程了,能力挪用接口,token也是一种加密方式,使用用户的信息进行加密,一样平常可以使用md5加密,我们来看一下token鉴权的进程。
第一步:用户使用账号暗码登录,向服务端提议http哀求
第二步:服务端校验账号暗码数据
第三步:验证胜利后,服务端会天生一个token,并将这个token返回给客户端
第四步:客户端收到这token后将它放在cookie或者当地存储
第五步:客户端再次向服务器提议哀求时带上token
第六步:服务端收到哀求,然后验证客户端哀求里面带着token来断定权限,假如验证胜利,就向客户端返回哀求的数据。
5、接口示例
以上阐发了这么多,接下来我们就来看一下各年夜厂界说的接口规范,有哪些值得我们进修的。
银联:
付出宝(付出宝必要引入付出宝的sdk,付出宝sdk内部进行了封装):
招商银行: