如何設(shè)計(jì)一個(gè)牛逼的API接口
在日常開發(fā)中,總會(huì)接觸到各種接口。前后端數(shù)據(jù)傳輸接口,第三方業(yè)務(wù)平臺(tái)接口。一個(gè)平臺(tái)的前后端數(shù)據(jù)傳輸接口一般都會(huì)在內(nèi)網(wǎng)環(huán)境下通信,而且會(huì)使用安全框架,所以安全性可以得到很好的保護(hù)。這篇文章重點(diǎn)討論一下提供給第三方平臺(tái)的業(yè)務(wù)接口應(yīng)當(dāng)如何設(shè)計(jì)?我們應(yīng)該考慮哪些問題?

?
一 安全性問題
1.1 調(diào)用接口的先決條件-token
appid,appkey,timestamp,nonce,sign。我們通過以上幾個(gè)參數(shù)來獲取調(diào)用系統(tǒng)的憑證。appid和appkey可以直接通過平臺(tái)線上申請(qǐng),也可以線下直接頒發(fā)。appid是全局唯一的,每個(gè)appid將對(duì)應(yīng)一個(gè)客戶,appkey需要高度保密。timestamp是時(shí)間戳,使用系統(tǒng)當(dāng)前的unix時(shí)間戳。時(shí)間戳的目的就是為了減輕DOS攻擊。防止請(qǐng)求被攔截后一直嘗試請(qǐng)求接口。服務(wù)器端設(shè)置時(shí)間戳閥值,如果請(qǐng)求時(shí)間戳和服務(wù)器時(shí)間超過閥值,則響應(yīng)失敗。nonce是隨機(jī)值。隨機(jī)值主要是為了增加sign的多變性,也可以保護(hù)接口的冪等性,相鄰的兩次請(qǐng)求nonce不允許重復(fù),如果重復(fù)則認(rèn)為是重復(fù)提交,響應(yīng)失敗。sign是參數(shù)簽名,將appkey,timestamp,nonce拼接起來進(jìn)行md5加密(當(dāng)然使用其他方式進(jìn)行不可逆加密也沒問題)。token,使用參數(shù)appid,timestamp,nonce,sign來獲取token,作為系統(tǒng)調(diào)用的唯一憑證。token可以設(shè)置一次有效(這樣安全性更高),也可以設(shè)置時(shí)效性,這里推薦設(shè)置時(shí)效性。如果一次有效的話這個(gè)接口的請(qǐng)求頻率可能會(huì)很高。token推薦加到請(qǐng)求頭上,這樣可以跟業(yè)務(wù)參數(shù)完全區(qū)分開來。1.2 使用POST作為接口請(qǐng)求方式
1.3 客戶端IP白名單
1.4 單個(gè)接口針對(duì)ip限流
1.5 記錄接口請(qǐng)求日志
1.6 敏感數(shù)據(jù)脫敏
RSA非對(duì)稱加密。非對(duì)稱加密算法有兩個(gè)密鑰,這兩個(gè)密鑰完全不同但又完全匹配。只有使用匹配的一對(duì)公鑰和私鑰,才能完成對(duì)明文的加密和解密過程。?
二 冪等性問題
?
三 數(shù)據(jù)規(guī)范問題
3.1 版本控制
3.2 響應(yīng)狀態(tài)碼規(guī)范

public?enum?CodeEnum?{
????//?根據(jù)業(yè)務(wù)需求進(jìn)行添加
????SUCCESS(200,"處理成功"),
????ERROR_PATH(404,"請(qǐng)求地址錯(cuò)誤"),
????ERROR_SERVER(505,"服務(wù)器內(nèi)部發(fā)生錯(cuò)誤");
????
????private?int?code;
????private?String?message;
????
????CodeEnum(int?code,?String?message)?{
????????this.code?=?code;
????????this.message?=?message;
????}
????public?int?getCode()?{
????????return?code;
????}
????public?void?setCode(int?code)?{
????????this.code?=?code;
????}
????public?String?getMessage()?{
????????return?message;
????}
????public?void?setMessage(String?message)?{
????????this.message?=?message;
????}
}
3.3 統(tǒng)一響應(yīng)數(shù)據(jù)格式
public?class?R?implements?Serializable?{
????private?static?final?long?serialVersionUID?=?793034041048451317L;
????private?int?code;
????private?String?message;
????private?Object?data?=?null;
????public?int?getCode()?{
????????return?code;
????}
????public?void?setCode(int?code)?{
????????this.code?=?code;
????}
????public?String?getMessage()?{
????????return?message;
????}
????public?void?setMessage(String?message)?{
????????this.message?=?message;
????}
????public?Object?getData()?{
????????return?data;
????}
????/**
?????*?放入響應(yīng)枚舉
?????*/
????public?R?fillCode(CodeEnum?codeEnum){
????????this.setCode(codeEnum.getCode());
????????this.setMessage(codeEnum.getMessage());
????????return?this;
????}
????/**
?????*?放入響應(yīng)碼及信息
?????*/
????public?R?fillCode(int?code,?String?message){
????????this.setCode(code);
????????this.setMessage(message);
????????return?this;
????}
????/**
?????*?處理成功,放入自定義業(yè)務(wù)數(shù)據(jù)集合
?????*/
????public?R?fillData(Object?data)?{
????????this.setCode(CodeEnum.SUCCESS.getCode());
????????this.setMessage(CodeEnum.SUCCESS.getMessage());
????????this.data?=?data;
????????return?this;
????}
}
?
總結(jié)
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號(hào)
好文章,我在看??
評(píng)論
圖片
表情
