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規范并沒有對HTTP header大小進行限制;盡管如此,出于對應用場景的考慮,作者希望對HTTP header進行80KB的大小限制。

” 不要允許設置任意大小的 HTTP header (包括狀態行) ,不要超過?HTTP_MAX_HEADER_SIZE的限制。這種檢驗師為了保護程序,防止‘阻斷服務攻擊(denial-of-service attack)’,攻擊者會填入一個無法加載完的請求頭,讓程序進入一個永遠在加載中的狀態。”

選自?Node.js HTTP parser

4 選擇一個合適的框架實現 Node.js REST API

選擇最適合項目應用場景的,才是最重要的。

Express, Koa 還是 Hapi

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

Restify

另一面,Restify是一個專注于構建REST服務的庫。它強制你使用嚴格模式構建你的API服務,以此保證整個系統的可維護性和可監控性。 Restify也帶有自動化工具?DTrace支持,動態監測你的程序。

Restify也被大量產品用在主程序里,比如npmNetflix

“Restify 讓你使用嚴格模式提供 API 服務,保持程序的可維護性和可監控性

點擊跳到Tweet

5 對 Node.js REST API 進行黑盒測試

檢驗你的REST API的最佳方式是進行黑盒測試。

黑盒測試是一種測試方法,就是排除任何主觀因素和已知條件,檢測每個功能是否都能正常使用。 所以沒有任何外部依賴是假數據或者樁代碼(stub),整個程序是看一個整體。

一個可以幫助你進行Node.js REST API黑盒測試的工具?supertest。

一個簡單的用來檢驗用戶返回數據的用例,如果使用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)
})})

也許你會問: 數據是怎樣通過REST API插入進數據庫的?

通常,一個好的寫測試用例的方法,就是盡可能減少假設的狀態。并且,在某些場景中,當你需要知道系統狀態的時候,黑盒測試可以發現系統設計的盲點,所以你可以通過斷言,實現更高的測試覆蓋率。

所以,根據你的需要,可以用下列方式之一,用測試數據填充數據庫:

當然,黑盒測試不意味這你不需要單元測試,你也需要給你的API寫單元測試腳本unit tests

使用RisingStack的程序監聽和Debug專家

通過Trace提高REST API質量

學習更多

6 使用JWT-Based,無狀態身份認證

你的REST API必須是無狀態的,身份認證也一樣。JWT (JSON Web Token) 是個經典的解決方案。

JWT 由三部分構成:

在你的程序中加入 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'
}})

之后,在客戶端調的API會受到JWT保護。訪問受保護的端,你必須在請求頭Authorization?字段提供token。

curl --header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cC

你可能注意到了,JWT不依賴任何數據層。因為JWT可以通過tokens自我驗證,請求也可以包含請求有效時間。

當然,你也可以通過HTTPS來保護你的API安全。

推薦一篇有價值的文章,詳解web安全認證方法?。

7 使用條件請求

You can think of these headers as preconditions: if they are met, the requests will be executed in a different way.

條件請求根據HTTP header不同,返回不同。你可以把這些HTTP header作為先決條件:當條件符合,就會獲得相應的返回。

對于條件請求,返回什么結果取決于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希望檢測,這一版本的資源是否存在服務端,并返回對應版本的資源。所以,header可能包括如下信息:

對應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.

下面,客戶端先前沒有任何關于?doc?資源的版本,所以在發送請求時沒有If-Modified-Since, 和?If-None-Match信息。之后服務端返回資源,并在響應頭里寫EtagLast-Modified?。

引自:MDN條件請求文檔

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

引自 MDN條件請求文檔

8 請求頻率限制

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

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

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

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

9 創建一個合適的API文檔

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

以下開源項目可以幫助你創建API文檔:

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

10 不要錯過未來的API

在過去的幾年中,出現了兩個API查詢語言,Facebook的GraphQL和Netflix的Falcor。但我們為什么需要它們?

想象以下RESTful資源請求:

/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=

這很容易失控——如果你希望按照相同的數據結構返回數據。這是GraphQL和Falcor解決的問題。

關于GraphQL

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

關于Falcor

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

令人驚訝的REST API靈感

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

本文章轉載微信公眾號@前端那些事兒

上一篇:

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

下一篇:

基于NodeJS的KOA2框架實現restful API網站后臺
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

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

#AI深度推理大模型API

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

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