生活随笔
收集整理的這篇文章主要介紹了
api接口设计
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
api接口設(shè)計(jì)
健壯性
對(duì)外提供的接口,最好支持冪等性,即相同的請(qǐng)求重復(fù)調(diào)用,服務(wù)端的操作應(yīng)該只有一次,并且每次返回的結(jié)果應(yīng)該是一樣的。
一般的做法是要求客戶端在每次調(diào)用的時(shí)候帶上唯一鍵,服務(wù)端第一次正常處理,并緩存唯一鍵和結(jié)果,后面再有重復(fù)調(diào)用,即可直接獲取緩存結(jié)果返回。
如果客戶端沒(méi)有唯一鍵的條件,也可以要求傳時(shí)間戳,用時(shí)間戳作為唯一鍵。對(duì)外的接口,粒度能細(xì)就細(xì),最好不要是那種入?yún)⑹莟ype,然后服務(wù)端根據(jù)type類型返回不同的數(shù)據(jù),這樣容易被調(diào)用方猜到一些服務(wù)端不想暴漏的內(nèi)容。
舉個(gè)例子,比如你要對(duì)外提供字典接口。 你的service方法是入?yún)ype, type=country,就返回所有國(guó)家字典;
type=currency,就返回所有幣種字典。
其實(shí)你只想對(duì)外暴漏這兩個(gè)功能,但其實(shí)你的service還支持type=company,就返回所有公司,
這個(gè)你是不想對(duì)外暴漏的,但有可能會(huì)被調(diào)用方猜到,從而獲取了隱私數(shù)據(jù)。
所以這種情況,就應(yīng)該把接口拆開(kāi),比如獲取國(guó)家就是一個(gè)接口,獲取幣種就是另外一個(gè)接口。接口的入?yún)?#xff0c;最好是包好的dto,這個(gè)不用多說(shuō),接口升級(jí)的時(shí)候,不會(huì)影響到用舊版本的客戶端,便于擴(kuò)展。接口的出參,盡可能的少,沒(méi)用的字段一定不要加,因?yàn)榭紤]到以后接口維護(hù)的時(shí)候,加字段好加,減字段可不好減。接口的出參,服務(wù)不要把異常直接拋出來(lái),一定要加全局異常捕獲,明確指定不同類型的出參碼,比如調(diào)用錯(cuò)誤是什么,參數(shù)錯(cuò)誤是什么等等。單一職責(zé),一個(gè)接口應(yīng)該是專門(mén)給一個(gè)功能或者一類特定功能用的,避免接口復(fù)用,這個(gè)也是擴(kuò)展性問(wèn)題。命名要統(tǒng)一,一定要有全局意識(shí)。比如所有的查詢都是find開(kāi)頭,所有的查列表都是以list結(jié)尾,所有的分頁(yè)都是currentPage+pageSize等等命名要準(zhǔn)確,隨便用漢字拼音首字母命名都是一種不負(fù)責(zé)任的做法
安全性
上面有提到用時(shí)間戳作為請(qǐng)求唯一鍵,可以做冪等。其實(shí)用時(shí)間戳,還有個(gè)好處,就是可以判斷是不是截取url的惡意調(diào)用。
因?yàn)槲覀兛梢耘袛喈?dāng)前時(shí)間和時(shí)間戳的間隔,如果大于某個(gè)值,比如大于5秒,我們就判定這個(gè)url無(wú)效。 這樣可以有效的抵擋一部分的DOS攻擊。如果調(diào)用方很確定,并且數(shù)量不多的話,直接配置ip白名單,簡(jiǎn)單高效。再?gòu)?fù)雜的設(shè)計(jì),比如簽名驗(yàn)證,但個(gè)人覺(jué)得這個(gè)普通場(chǎng)景沒(méi)什么必要,增加復(fù)雜度,
但安全度極高的場(chǎng)景,是必加的,而且至少要token+時(shí)間戳的簽名,token是客戶端的身份證明。
總結(jié)
以上是生活随笔為你收集整理的api接口设计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。