文章參考:https://blog.csdn.net/qq_33472765/article/details/81913627
案例0000001
接口調用請求說明:
https請求方式:GET(請使用https協議)
csrf=False
csrf(Cross-site request forgery跨站請求偽造)問題,get請求不影響,post就需要csrf認證
CSRF(跨站請求偽造)
CSRF 英文全稱為 Cross SIte Request Forgery
CSRF 通常指惡意攻擊者盜用用戶的名義,發送惡意請求,嚴重泄露個人信息危害財產的安全
@http.route('/forum/get_url_title', type='json', auth="public", methods=['POST'], website=True)
def get_url_title(self, **kwargs):
try:
req = requests.get(kwargs.get('url'))
req.raise_for_status()
arch = lxml.html.fromstring(req.content)
return arch.find(".//title").text
except IOError:
return False
響應數據格式:json
響應數據例子:
{
"data":ODOO_DATA
"result":{
"other_field":[]
"state":TRUE
}
}
對方通過:
http://127.0.0.1:8069//forum/get_url_title 傳送json數據過來:
二、情況2:發送數據給其他系統【執行函數】
1.調用其他系統做的服務接口:
案例0002:查詢數據案例:
步驟1:做一個統一登陸的函數:a:用戶名、b:密碼、c:密鑰【自動生成的密鑰]
步驟2:傳入查詢條件參數:調用接口服務函數執行查詢:【定義好服務端返回的數據格式json】
步驟3:將查詢好的數據解析:存儲在本系統中 re_data = json.dumps(test_data)
"""
#REST 與 SOAP 與 XML-RPC
具體介紹:
""" API接口開發總結:
什么是接口
接口無非就是客戶端請求你的接口地址,並傳入一堆該接口定義好的參數,通過接口自身的邏輯處理,返回接口約定好的數據以及相應的數據格式
接口怎么開發
接口由於本身的性質,由於和合作方對接數據,所以有以下幾點需要在開發的時候注意:
定義接口入參:寫好接口文檔
定義接口返回數據類型:一般都需要封裝成一定格式,確定返回json還是xml報文等
#一、情況1:接收從其他系統傳過來的數據:一般用http 形式數據格式json格式的。
1. 使用GET、POST、PUT、DELETE這幾種請求模式
請求模式也可以說是動作、數據傳輸方式,通常我們在web中的form有GET、POST兩種,而在HTTP中,存在下發這幾種。
GET (選擇):從服務器上獲取一個具體的資源或者一個資源列表。
POST (創建): 在服務器上創建一個新的資源。
PUT(更新):以整體的方式更新服務器上的一個資源。
PATCH (更新):只更新服務器上一個資源的一個屬性。
DELETE(刪除):刪除服務器上的一個資源。
HEAD : 獲取一個資源的元數據,如數據的哈希值或最后的更新時間。
OPTIONS:獲取客戶端能對資源做什么操作的信息。
常見的請求參數
比如在數據過多, 需要對數據進行分頁請求的時候, 我們應該統一 API 請求參數. 常見的有這些.
limit=10 指定返回記錄的數量
offset=10 指定返回記錄的開始位置。
page=2&per_page=100 指定第幾頁,以及每頁的記錄數。
sortby=name&order=asc 指定返回結果按照哪個屬性排序,以及排序順序。
animal_type_id=1 指定篩選條件
3.json數據類型
接口的數據一般都采用JSON格式進行傳輸,不過,需要注意的是,JSON的值只有六種數據類型:
Number:整數或浮點數
String:字符串
Boolean:true 或 false
Array:數組包含在方括號[]中
Object:對象包含在大括號{}中
Null:空類型
4.返回的數據結構
服務器返回的數據結構,一般為:
{
code:0,
message: "S",
data: { key1: value1, key2: value2, ... }
}
code: 返回碼,0表示成功,非0表示各種不同的錯誤
message: 描述信息,成功時為"success",錯誤時則是錯誤信息
data: 成功時返回的數據,類型為對象或數組
不同錯誤需要定義不同的返回碼,屬於客戶端的錯誤和服務端的錯誤也要區分,比如1XX表示客戶端的錯誤,2XX表示服務端的錯誤。這里舉幾個例子:
0:成功
100:請求錯誤
101:缺少appKey
102:缺少簽名
103:缺少參數
200:服務器出錯
201:服務不可用
202:服務器正在重啟
5. 使用SSL(https)來提供URL
首先,使用https可以在數據包被抓取時多一層加密。我們現在的APP使用環境大部分都是在路由器WIFI環境下,一旦路由器被入侵,那么黑客可以非常容易的抓取到用戶通過路由器傳輸的數據,如果使用http未經加密,那么黑客可以很輕松的獲取用戶的信息,甚至是賬戶信息。
其次,即使使用https,也要在API數據傳輸設計時,正確的采用加密。例如直接將token信息放在URL中的做法,即使你使用了https,黑客抓不到你具體傳輸的數據,但是可以抓到你請求的URL啊!(查了資料了,https用GET方式請求,也僅能抓到域名字符部分,不能抓到請求的數據,
但是URL可以在瀏覽器或特殊客戶端工具中直接看到。多謝下面的朋友指正錯誤)因此,使用https進行請求時,要采用POST、PUT或者HEAD的方式傳輸必要的數據。
6.TOKEN
現在,大部分App的接口都采用RESTful架構,RESTFul最重要的一個設計原則就是,客戶端與服務器的交互在請求之間是無狀態的,也就是說,當涉及到用戶狀態時,每次請求都要帶上身份驗證信息。實現上,大部分都采用token的認證方式,一般流程是:
用戶用密碼登錄成功后,服務器返回token給客戶端;
客戶端將token保存在本地,發起后續的相關請求時,將token發回給服務器;
服務器檢查token的有效性,有效則返回數據,若無效,分兩種情況:
token錯誤,這時需要用戶重新登錄,獲取正確的token
token過期,這時客戶端需要再發起一次認證請求,獲取新的token
然而,此種驗證方式存在一個安全性問題:當登錄接口被劫持時,黑客就獲取到了用戶密碼和token,后續則可以對該用戶做任何事情了。用戶只有修改密碼才能奪回控制權。
如何優化呢?第一種解決方案是采用HTTPS。HTTPS在HTTP的基礎上添加了SSL安全協議,自動對數據進行了壓縮加密,在一定程序可以防止監聽、防止劫持、防止重發,安全性可以提高很多。不過,SSL也不是絕對安全的,也存在被劫持的可能。另外,服務器對HTTPS的配置相對有點復雜,還需要到CA申請證書,而且一般還是收費的。而且,HTTPS效率也比較低。一般,只有安全要求比較高的系統才會采用HTTPS,比如銀行。而大部分對安全要求沒那么高的App還是采用HTTP的方式。
我們目前的做法是給每個接口都添加簽名。給客戶端分配一個密鑰,每次請求接口時,將密鑰和所有參數組合成源串,根據簽名算法生成簽名值,發送請求時將簽名一起發送給服務器驗證。類似的實現可參考OAuth1.0的簽名算法。這樣,黑客不知道密鑰,不知道簽名算法,就算攔截到登錄接口,后續請求也無法成功操作。不過,因為簽名算法比較麻煩,而且容易出錯,只適合對內的接口。如果你們的接口屬於開放的API,則不太適合這種簽名認證的方式了,建議還是使用OAuth2.0的認證機制。
我們也給每個端分配一個appKey,比如Android、iOS、微信三端,每個端分別分配一個appKey和一個密鑰。沒有傳appKey的請求將報錯,傳錯了appKey的請求也將報錯。這樣,安全性方面又加多了一層防御,同時也方便對不同端做一些不同的處理策略。
另外,現在越來越多App取消了密碼登錄,而采用手機號+短信驗證碼的登錄方式,我在當前的項目中也采用了這種登錄方式。這種登錄方式有幾種好處:
不需要注冊,不需要修改密碼,也不需要因為忘記密碼而重置密碼的操作了;
用戶不再需要記住密碼了,也不怕密碼泄露的問題了;
相對於密碼登錄其安全性明顯提高了。
7.用戶設計
顯式用戶和隱式用戶,我不知道這兩個詞用的是否確切。
顯式用戶指的是,APP程序中有用戶系統,一個username、password正確的合法用戶,稱之為顯式的用戶,
通常顯式用戶都需要注冊,登錄以后能完成一些個人相關的操作。
隱式用戶指的是,APP程序本身就沒有用戶系統,或者一個在沒有登錄的情況下,使用我們APP的用戶。
在這種情況下,可以通過客戶端生成的UDID來標識一個用戶。
有了用戶信息,我們就能夠了解不同用戶的使用習慣,而不僅僅是全體用戶的一個整體的統計信息,
有了這些個體的信息之后,就可以做一些用戶分群、個性化推薦之類的事情。
如果是SAAS版本,還需要區分不同商戶的用戶
8.良好的接口說明文檔和測試程序
接口文檔有時候是項目初期就定下來的,前后端開發人員按照接口規范開發,
有的是接口開發完成后寫的。
接口文檔要清晰、明了,包含多少個接口,每個接口的地址、參數、請求方式、數據交換格式、返回值等都要寫清楚。
接口測試程序,有條件的話,也可以提供,方便前后端的調試。
如果是springMVC開發的話,可以用swagger,后端只要加幾個注釋發一個url給前端就可以了,輕松又高效。
9.接口統計功能
在做PC端網站的時候,我們都會給我們的網站加上個統計功能,要么自己寫統計系統,要么使用第三方的比如GA、百度等。
移動端接口API則需要我們自己實現統計功能,
這時就需要我們盡可能多的收集客戶端的信息,除了傳統的IP、User-Agent之外,還應該收集一些移動相關的信息,
比如
手機操作系統,是android還是ios,都是什么版本,
用戶使用的網絡狀況,是2G、3G、4G還是WIFI
客戶端APP是什么版本信息。
這樣,有助於我們更好的了解我們用戶的使用