如何設計乙個牛逼的API介面

2022-03-10 01:47:34 字數 2554 閱讀 2110

在日常開發中,總會接觸到各種介面。前後端資料傳輸介面,第三方業務平台介面。乙個平台的前後端資料傳輸介面一般都會在內網環境下通訊,而且會使用安全框架,所以安全性可以得到很好的保護。這篇文章重點討論一下提供給第三方平台的業務介面應當如何設計?我們應該考慮哪些問題?

主要從以上三個方面來設計乙個安全的api介面。

安全性問題是乙個介面必須要保證的規範。如果介面保證不了安全性,那麼你的介面相當於直接暴露在公網環境中任人蹂躪。

timestamp是時間戳,使用系統當前的unix時間戳。時間戳的目的就是為了減輕dos攻擊。防止請求被攔截後一直嘗試請求介面。伺服器端設定時間戳閥值,如果請求時間戳和伺服器時間超過閥值,則響應失敗。

nonce是隨機值。隨機值主要是為了增加sign的多變性,也可以保護介面的冪等性,相鄰的兩次請求nonce不允許重複,如果重複則認為是重複提交,響應失敗。

一般呼叫介面最常用的兩種方式就是get和post。兩者的區別也很明顯,get請求會將引數暴露在瀏覽器url中,而且對長度也有限制。為了更高的安全性,所有介面都採用post方式請求。

ip白名單是指將介面的訪問許可權對部分ip進行開放。這樣就能避免其他ip進行訪問攻擊,設定ip白名單比較麻煩的一點就是當你的客戶端進行遷移後,就需要重新聯絡服務提供者新增新的ip白名單。設定ip白名單的方式很多,除了傳統的防火牆之外,spring cloud alibaba提供的元件sentinel也支援白名單設定。為了降低api的複雜度,推薦使用防火牆規則進行白名單設定。

限流是為了更好的維護系統穩定性。使用redis進行介面呼叫次數統計,ip+介面位址作為key,訪問次數作為value,每次請求value+1,設定過期時長來限制介面的呼叫頻率。

使用aop全域性記錄請求日誌,快速定位異常請求位置,排查問題原因。

在介面呼叫過程中,可能會涉及到訂單號等敏感資料,這類資料通常需要脫敏處理,最常用的方式就是加密。加密方式使用安全性比較高的rsa非對稱加密。非對稱加密演算法有兩個金鑰,這兩個金鑰完全不同但又完全匹配。只有使用匹配的一對公鑰和私鑰,才能完成對明文的加密和解密過程。

冪等性是指任意多次請求的執行結果和一次請求的執行結果所產生的影響相同。說的直白一點就是查詢操作無論查詢多少次都不會影響資料本身,因此查詢操作本身就是冪等的。但是新增操作,每執行一次資料庫就會發生變化,所以它是非冪等的。

冪等問題的解決有很多思路,這裡講一種比較嚴謹的。提供乙個生成隨機數的介面,隨機數全域性唯一。呼叫介面的時候帶入隨機數。第一次呼叫,業務處理成功後,將隨機數作為key,操作結果作為value,存入redis,同時設定過期時長。第二次呼叫,查詢redis,如果key存在,則證明是重複提交,直接返回錯誤。

一套成熟的api文件,一旦發布是不允許隨意修改介面的。這時候如果想新增或者修改介面,就需要加入版本控制,版本號可以是整數型別,也可以是浮點數型別。一般介面位址都會帶上版本號,http://ip:port//v1/list。

乙個牛逼的api,還需要提供簡單明瞭的響應值,根據狀態碼就可以大概知道問題所在。我們採用http的狀態碼進行資料封裝,例如200表示請求成功,4xx表示客戶端錯誤,5xx表示伺服器內部發生錯誤。狀態碼設計參考如下:

分類描述

1xx資訊,伺服器收到請求,需要請求者繼續執行操作

2xx成功

3xx重定向,需要進一步的操作以完成請求

4xx客戶端錯誤,請求包含語法錯誤或無法完成請求

5xx服務端錯誤

狀態碼列舉類:

public enum codeenum 

public int getcode()

public void setcode(int code)

public string getmessage()

public void setmessage(string message)

}

為了方便給客戶端響應,響應資料會包含三個屬性,狀態碼(code),資訊描述(message),響應資料(data)。客戶端根據狀態碼及資訊描述可快速知道介面,如果狀態碼返回成功,再開始處理資料。

響應結果定義及常用方法:

public class r implements serializable 

public void setcode(int code)

public string getmessage()

public void setmessage(string message)

public object getdata()

/*** 放入響應列舉

*/public r fillcode(codeenum codeenum)

/*** 放入響應碼及資訊

*/public r fillcode(int code, string message)

/*** 處理成功,放入自定義業務資料集合

*/public r filldata(object data)

}

如何設計乙個安全的API介面詳解

目錄 在日常開發中,總會接觸到各種介面。前後端資料傳輸介面,第三方業務平台介面。乙個平台的前後端資料傳輸介面一般都會在內網環境下通訊,而且會使用安全框架,所以安全性可以得到很好的保護。這篇文章重點討論一下提供給第三方平台的業務介面應當如何設計?我們應該考慮哪些問題?主要從以上三個方面來設計乙個安全的...

乙個牛逼的FTP Wring Ftp

背景 總公司內網有一部分文件需要共享,想要乙個能便捷管理的文件系統 需求 分帳號授權,有的帳號只能看,有的帳號只能新增,有的帳號可以增刪改查,另外可以便捷的對帳號進行管理 方法 一 wing ftp簡介 1 中文官網 2 線上演示 onlinedemo.htm 二 wing ftp本地安裝 linu...

如何設計乙個優秀的API

到目前為止,已經負責api接近兩年了,這兩年中發現現有的api存在的問題越來越多,但很多api一旦發布後就不再能修改了,即時公升級和維護是必須的。一旦api發生變化,就可能對相關的呼叫者帶來巨大的代價,使用者需要排查所有呼叫的 需要調整所有與之相關的部分,這些工作對他們來說都是額外的。如果辛辛苦苦完...