鍵.png)
ASP.NET Web API快速入門介紹
OpenStack-Networking-Host-Name
OpenStack-Object-Storage-Policy
however, Node.js (as of writing this article) imposes an 80KB size limit on the headers object for practical reasons.
注意,HTTP規(guī)范并沒有對HTTP header大小進(jìn)行限制;盡管如此,出于對應(yīng)用場景的考慮,作者希望對HTTP header進(jìn)行80KB的大小限制。
” 不要允許設(shè)置任意大小的 HTTP header (包括狀態(tài)行) ,不要超過?HTTP_MAX_HEADER_SIZE
的限制。這種檢驗師為了保護(hù)程序,防止‘阻斷服務(wù)攻擊(denial-of-service attack)’,攻擊者會填入一個無法加載完的請求頭,讓程序進(jìn)入一個永遠(yuǎn)在加載中的狀態(tài)。”
選擇最適合項目應(yīng)用場景的,才是最重要的。
Express,Koa 和 Hapi 都可以支持瀏覽器調(diào)用,并且他們都支持模板和后端渲染,這里我們之羅列一小部分他們的特性。如果你的應(yīng)用需要面向用戶(界面),這些特性對他們是有意義的。
另一面,Restify是一個專注于構(gòu)建REST服務(wù)的庫。它強(qiáng)制你使用嚴(yán)格模式構(gòu)建你的API服務(wù),以此保證整個系統(tǒng)的可維護(hù)性和可監(jiān)控性。 Restify也帶有自動化工具?DTrace支持,動態(tài)監(jiān)測你的程序。
Restify也被大量產(chǎn)品用在主程序里,比如npm和Netflix。
“Restify 讓你使用嚴(yán)格模式提供 API 服務(wù),保持程序的可維護(hù)性和可監(jiān)控性
檢驗?zāi)愕?a href="http://www.dlbhg.com/blog/rest-api-examples/">REST API的最佳方式是進(jìn)行黑盒測試。
黑盒測試是一種測試方法,就是排除任何主觀因素和已知條件,檢測每個功能是否都能正常使用。 所以沒有任何外部依賴是假數(shù)據(jù)或者樁代碼(stub),整個程序是看一個整體。
一個可以幫助你進(jìn)行Node.js REST API黑盒測試的工具?supertest。
一個簡單的用來檢驗用戶返回數(shù)據(jù)的用例,如果使用mocha?完成的話,如下:
const request = require('supertest')describe('GET /user/:id', function() {
it('returns a user', function() {
// newer mocha versions accepts promises as well
return request(app)
.get('/user')
.set('Accept', 'application/json')
.expect(200, {
id: '1',
name: 'John Math'
}, done)
})})
通常,一個好的寫測試用例的方法,就是盡可能減少假設(shè)的狀態(tài)。并且,在某些場景中,當(dāng)你需要知道系統(tǒng)狀態(tài)的時候,黑盒測試可以發(fā)現(xiàn)系統(tǒng)設(shè)計的盲點,所以你可以通過斷言,實現(xiàn)更高的測試覆蓋率。
所以,根據(jù)你的需要,可以用下列方式之一,用測試數(shù)據(jù)填充數(shù)據(jù)庫:
當(dāng)然,黑盒測試不意味這你不需要單元測試,你也需要給你的API寫單元測試腳本unit tests。
使用RisingStack的程序監(jiān)聽和Debug專家
你的REST API必須是無狀態(tài)的,身份認(rèn)證也一樣。JWT (JSON Web Token) 是個經(jīng)典的解決方案。
JWT 由三部分構(gòu)成:
在你的程序中加入 JWT-based 非常簡單:
const koa = require('koa')const jwt = require('koa-jwt')const app = koa()app.use(jwt({
secret: 'very-secret'}))// Protected middlewareapp.use(function *(){
// content of the token will be available on this.state.user
this.body = {
secret: '42'
}})
之后,在客戶端調(diào)的API會受到JWT保護(hù)。訪問受保護(hù)的端,你必須在請求頭Authorization
?字段提供token。
curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cC
你可能注意到了,JWT不依賴任何數(shù)據(jù)層。因為JWT可以通過tokens自我驗證,請求也可以包含請求有效時間。
當(dāng)然,你也可以通過HTTPS來保護(hù)你的API安全。
推薦一篇有價值的文章,詳解web安全認(rèn)證方法?。
You can think of these headers as preconditions: if they are met, the requests will be executed in a different way.
條件請求根據(jù)HTTP header不同,返回不同。你可以把這些HTTP header作為先決條件:當(dāng)條件符合,就會獲得相應(yīng)的返回。
對于條件請求,返回什么結(jié)果取決于HTTP header
These headers try to check whether a version of a resource stored on the server matches a given version of the same resource. Because of this reason, these headers can be:
這些header希望檢測,這一版本的資源是否存在服務(wù)端,并返回對應(yīng)版本的資源。所以,header可能包括如下信息:
對應(yīng)API:
Last-Modified
(標(biāo)識當(dāng)前資源最后修改時間)Etag
(實體標(biāo)簽,標(biāo)識版本)If-Modified-Since
(和Last-Modified
一起使用)If-None-Match
(和Etag
一起使用)The client below did not have any previous versions of the doc
resource, so neither the If-Modified-Since
, nor the If-None-Match
header was applied when the resource was sent. Then, the server responds with the Etag
and Last-Modified
headers properly set.
下面,客戶端先前沒有任何關(guān)于?doc
?資源的版本,所以在發(fā)送請求時沒有If-Modified-Since
, 和?If-None-Match
信息。之后服務(wù)端返回資源,并在響應(yīng)頭里寫Etag
和Last-Modified
?。
引自:MDN條件請求文檔
如果在請求的時候,客戶端設(shè)置了If-Modified-Since
和If-None-Match
,一旦請求這個資源, 這個驗證這個資源的版本。如果版本相同,服務(wù)器只是回應(yīng)304?-?Not Modified
?狀態(tài),不返回其他信息。
引自 MDN條件請求文檔
請求頻率限制用于控制API可以被消費多少次。
可以通過設(shè)置HTTP header告訴客戶端還有多少請求可以被消費:
X-Rate-Limit-Limit
同一個時間段所允許的請求的最大數(shù)目X-Rate-Limit-Remaining
在當(dāng)前時間段內(nèi)剩余的請求的數(shù)量X-Rate-Limit-Reset
為了得到最大請求數(shù)所等待的秒數(shù)大部分HTTP框架支持這種寫法(或通過插件支持)。舉個例子,如果你用Koa,可以使用?koa-ratelimit這個包。
注意,請求時間間隔可以根據(jù)API不同,設(shè)置不同。比如 GitHub時間間隔是1小時,Twitter是15分鐘。
你寫的API是給別人用的,要對別人有價值。提供一個API文檔是十分重要的。
以下開源項目可以幫助你創(chuàng)建API文檔:
在過去的幾年中,出現(xiàn)了兩個API查詢語言,F(xiàn)acebook的GraphQL和Netflix的Falcor。但我們?yōu)槭裁葱枰鼈儯?/p>
想象以下RESTful資源請求:
/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=
這很容易失控——如果你希望按照相同的數(shù)據(jù)結(jié)構(gòu)返回數(shù)據(jù)。這是GraphQL和Falcor解決的問題。
GraphQL是一門API查詢語言,運行時為完成這些查詢現(xiàn)有數(shù)據(jù)。GraphQL提供了一套完整的,易于理解的,可以描述數(shù)據(jù)的API。讓客戶端有了完整描述自己需要的數(shù)據(jù)的能力,隨著時間的推移,這種方式可能演變成API,成為更強(qiáng)大的開發(fā)工具。了解更多
Falcor一個創(chuàng)新的數(shù)據(jù)抓取哭,支撐著Netflix UI。Falcor允許你通過一個Node服務(wù)上的虛擬JSON操作任何后臺數(shù)據(jù)。在客戶端,使用遠(yuǎn)程JSON對象,通過get,set, call查找數(shù)據(jù),數(shù)據(jù)就是API 。了解更多
如果你正想要開發(fā)Node.js REST API或者更新一個版本,我們收集了4個有價值的,現(xiàn)實中的例子:
本文章轉(zhuǎn)載微信公眾號@前端那些事兒