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)。”

選自?Node.js HTTP parser

4 選擇一個合適的框架實現(xiàn) Node.js REST API

選擇最適合項目應(yīng)用場景的,才是最重要的。

Express, Koa 還是 Hapi

ExpressKoa 和 Hapi 都可以支持瀏覽器調(diào)用,并且他們都支持模板和后端渲染,這里我們之羅列一小部分他們的特性。如果你的應(yīng)用需要面向用戶(界面),這些特性對他們是有意義的。

Restify

另一面,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)品用在主程序里,比如npmNetflix

“Restify 讓你使用嚴(yán)格模式提供 API 服務(wù),保持程序的可維護(hù)性和可監(jiān)控性

點擊跳到Tweet

5 對 Node.js REST API 進(jì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ù)據(jù)是怎樣通過REST API插入進(jìn)數(shù)據(jù)庫的?

通常,一個好的寫測試用例的方法,就是盡可能減少假設(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專家

通過Trace提高REST API質(zhì)量

學(xué)習(xí)更多

6 使用JWT-Based,無狀態(tài)身份認(rèn)證

你的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)證方法?。

7 使用條件請求

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

點擊跳到Tweet

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:

一個例子

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)頭里寫EtagLast-Modified?。

引自:MDN條件請求文檔

如果在請求的時候,客戶端設(shè)置了If-Modified-SinceIf-None-Match,一旦請求這個資源, 這個驗證這個資源的版本。如果版本相同,服務(wù)器只是回應(yīng)304?-?Not Modified?狀態(tài),不返回其他信息。

引自 MDN條件請求文檔

8 請求頻率限制

請求頻率限制用于控制API可以被消費多少次。

可以通過設(shè)置HTTP header告訴客戶端還有多少請求可以被消費:

大部分HTTP框架支持這種寫法(或通過插件支持)。舉個例子,如果你用Koa,可以使用?koa-ratelimit這個包。

注意,請求時間間隔可以根據(jù)API不同,設(shè)置不同。比如 GitHub時間間隔是1小時,Twitter是15分鐘。

9 創(chuàng)建一個合適的API文檔

你寫的API是給別人用的,要對別人有價值。提供一個API文檔是十分重要的。

以下開源項目可以幫助你創(chuàng)建API文檔:

如果你想使用API自動生成工具,推薦?Apiary

10 不要錯過未來的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解決的問題。

關(guān)于GraphQL

GraphQL是一門API查詢語言,運行時為完成這些查詢現(xiàn)有數(shù)據(jù)。GraphQL提供了一套完整的,易于理解的,可以描述數(shù)據(jù)的API。讓客戶端有了完整描述自己需要的數(shù)據(jù)的能力,隨著時間的推移,這種方式可能演變成API,成為更強(qiáng)大的開發(fā)工具。了解更多

關(guān)于Falcor

Falcor一個創(chuàng)新的數(shù)據(jù)抓取哭,支撐著Netflix UI。Falcor允許你通過一個Node服務(wù)上的虛擬JSON操作任何后臺數(shù)據(jù)。在客戶端,使用遠(yuǎn)程JSON對象,通過get,set, call查找數(shù)據(jù),數(shù)據(jù)就是API了解更多

令人驚訝的REST API靈感

如果你正想要開發(fā)Node.js REST API或者更新一個版本,我們收集了4個有價值的,現(xiàn)實中的例子:

本文章轉(zhuǎn)載微信公眾號@前端那些事兒

上一篇:

或許是你應(yīng)該了解的一些 ASP.NET Core Web API 使用小技巧

下一篇:

基于NodeJS的KOA2框架實現(xiàn)restful API網(wǎng)站后臺
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費