這里說的坑八孝,都是實(shí)際項目中遇到的,記錄下來鸠项,也與讀者分享干跛。
1. Content-Length一定盡量與body長度一致
Content-Length用來標(biāo)識http請求or響應(yīng)的body的長度(即字節(jié)數(shù)),是http報文分界的一種方法祟绊。由于程序bug或者故障楼入,有可能導(dǎo)致http報文中的body長度與Content-Length不一致:
-
http請求的body長度與其Content-Length不一致
后果- Content-Length > body長度哥捕,則服務(wù)器端卡住,只能通過超時或者關(guān)閉連接解決嘉熊;
- Content-Length < body長度遥赚,則連接腐爛,只能關(guān)閉連接(影響長連接效果)阐肤。
-
http響應(yīng)的body長度與其Content-Length不一致
后果- Content-Length > body長度 客戶端卡著凫佛,只能通過超時或者關(guān)閉連接解決
- Content-Length < body長度 連接腐爛,只能關(guān)閉連接
這么看孕惜,Content-Length應(yīng)該是要一定與body長度一致愧薛,為什么說盡量?因為出故障時我們可能無能為力:比如我們數(shù)據(jù)庫記錄了一個文件大小為100MB诊赊,于是設(shè)置Content-Length=100MB厚满,然后把文件內(nèi)容作為body返回客戶端,但是文件已經(jīng)損壞(只有讀的時候才能發(fā)現(xiàn))碧磅,只有50M,由于http的start line和headers已經(jīng)發(fā)給了客戶端遵馆,沒法更改了鲸郊,客戶端收到50M內(nèi)容后,繼續(xù)等待接收剩下的50M货邓,直至超時或連接關(guān)閉秆撮,表現(xiàn)為客戶端卡著。
2. 參數(shù)parameter最小化
舉例: 如果我們有2個接口(來自AWS S3文檔)
設(shè)置跨域規(guī)則接口
PUT /?cors HTTP/1.1
Host: bucketname.s3.amazonaws.com
設(shè)置生命周期管理接口
PUT /?lifecycle HTTP/1.1
Host: bucketname.s3.amazonaws.com
那么服務(wù)端應(yīng)該這樣實(shí)現(xiàn):
- 參數(shù)只有cors -- 按照設(shè)置跨域規(guī)則來處理
- 參數(shù)只有l(wèi)ifecycle -- 按照設(shè)置生命周期管理來處理
- 否則 -- 返回400 Bad Request
不遵循的危害:影響接口擴(kuò)展
比如 如果前期服務(wù)器將/?lifecycle
和/?lifecycle&haha
同等對待换况,那么由于Rest API是開放的以及客戶端實(shí)現(xiàn)的不確定性职辨,不好保證有的用戶發(fā)的是/?lifecycle&haha
接口。如果后期服務(wù)器想加個接口/?lifecycle&haha
以實(shí)現(xiàn)其他功能戈二,則因為該接口可能已被當(dāng)做/?lifecycle
來對待而造成困擾舒裤。