精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

編寫Node.js Rest API的十個最佳實踐

開發 后端
Node.js 除了用來編寫 WEB 應用之外,還可以用來編寫 API 服務,我們在本文中會介紹編寫 Node.js REST API 的最佳實踐,包括如何命名路由、進行認證和測試等話題,內容摘要如下:

Node.js 除了用來編寫 WEB 應用之外,還可以用來編寫 API 服務,我們在本文中會介紹編寫 Node.js REST API 的最佳實踐,包括如何命名路由、進行認證和測試等話題,內容摘要如下:

  1. 正確使用 HTTP Method 和路由
  2. 正確的使用 HTTP 狀態碼
  3. 使用 HTTP Header 來發送元數據
  4. 為 REST API 挑選合適的框架
  5. 要對 API 進行黑盒測試
  6. 使用基于 JWT 的無狀態的認證機制
  7. 學會使用條件請求機制
  8. 擁抱接口調用頻率限制(Rate-Limiting)
  9. 編寫良好的 API 文檔
  10. 對 API 技術演化保持關注

1. 正確使用 HTTP Method 和路由

試想你正要構建一個 API 用來創建、更新、獲取、刪除用戶,對于這些操作,HTTP 規范里面已經有了現成的操作:POST、PUT、GET、DELETE,建議直接使用他們來描述接口的行為。

至于路由的命名,應該使用名詞或名詞性短語來作為資源標識符,比如上文提到的用戶管理的例子,路由就應該長這樣:

  • POST /users 或者 PUT /users/:id 用來創建新用戶;
  • GET /users 用來獲取用戶列表;
  • GET /users/:id 用來獲取單個用戶;
  • PATCH /users/:id 用來更新用戶信息;
  • DELETE /users/:id 用來刪除用戶;

2. 正確的使用 HTTP 狀態碼

如果服務器端在請求處理的過程中出錯了,你必須設置正確的響應狀態碼,具體如下:

  • 2xx,表示一切正常;
  • 3xx,表示資源位置已經更改;
  • 4xx,表示因為客戶端錯誤而導致請求無法被處理,比如參數校驗沒通過;
  • 5xx,表示因為服務器錯誤導致請求無法被處理,比如服務端拋了異常;

如果你使用 express,設置狀態碼非常簡單:res.status(500).send({ error: ‘Internal server error happend’ }),如果使用了 restify,也是類似的:res.status(201)。

如果想看完整的 HTTP 狀態碼,點擊這里

3. 使用 HTTP Header 來發送元數據

如果想要發送關于響應體數據的元數據,可以使用 Header ,Header 可以包含的常見元數據包括如下幾類:

  • 分頁信息;
  • 頻率限制信息;
  • 認證信息;

如果你需要在 Header 中發送自定義的元數據,最好的做法是在 Header 名稱前面加 X,例如,需要發送 CSRF Token 的時候,實際的 Header 應該命名為:X-CSRF-Token,然而,這種 Header 在 RFC 6648 中已經被廢棄了。API 在設置自定義 Header 的時候還要盡可能避免命名沖突,比如為了達到這個目的OpenStack 為所有 API 的自定義 Header 都加上了 OpenStack 的前綴:

OpenStack-Identity-Account-ID  
OpenStack-Networking-Host-Name  
OpenStack-Object-Storage-Policy

需要注意的是,雖然 HTTP 規范中沒有規定 Header 的大小,但是 Node.js 中 Header 的大小被限制在了 80KB。官方原文如下:

不要讓 HTTP Header ,包括其中狀態碼那行的整體大小超過 HTTP_MAX_Header_SIZE,這樣做的目的是為了防御基于 Header 的 DDOS 攻擊。點擊這里

4. 為 REST API 挑選合適的框架

根據你的實際場景挑選合適的框架是非常重要的,Node.js 中的框架大致介紹如下:

Express、Koa、HAPI

Express、Koa、HAPI 主要是用來構建瀏覽器 WEB 應用,因為他們都支持服務端模板渲染,雖然這只是他們眾多功能中的一個。如果你的應用需要提供用戶界面,那么這三個就是不錯的選擇。

Restify

而 Restify 是專門用來創建符合 REST 規范的服務的,他誕生的目的就是幫你構建嚴格意義上的、可維護的 API 服務。Restify 內置了所有請求處理函數的 DTrace 支持。并且已經被 npm 和 netflix 用來在生產環境提供重要的服務。

5. 要對 API 進行黑盒測試

測試 API 的最好辦法是對他們進行黑盒測試,黑盒測試是一種不關心應用內部結構和工作原理的測試方法,測試時系統任何部分都不應該被 mock。

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);
  });
});

可能有人會問:API 服務所連接的數據庫里面的數據是如何寫進去的呢?

通常來說,你寫測試的時候,要盡可能不對系統狀態做假設,然而在某些場景下,你需要準確的知道系統當前所處的狀態以增加更多的斷言來提高測試覆蓋率。如果你有這種需求,你可以試用如下的方法對數據庫進行預填充:

  • 選擇生產環境數據的子集來運行黑盒測試;
  • 運行黑盒測試之前把手工構造的數據填充到數據庫中。

此外,有了黑盒測試并不意味著不需要單元測試,針對 API 的單元測試還是需要編寫的。

6. 使用基于 JWT 的無狀態的認證機制

因為 Rest API 必須是無狀態的,因此認證機制也需要是無狀態的,而基于 JWT(JSON Web Token) 的認證機制是無狀態認證機制中的最佳解決方案。

JWT 的認證機制包含三部分:

  1. Header:包含 token 的類型和哈希算法;
  2. payload:包含聲明信息;
  3. signature:JWT 實際上并不是對 payload 進行加密,只是對其做了簽名;

為 API 添加基于 JWT 的認證機制也非常的簡單,比如下面的代碼:

const koa = require('koa');
const jwt = require('koa-jwt');

const app = koa();

app.use(jwt(
  secret: 'very-secret'
}));

// Protected middleware
app.use(function*()    // content of the token will be available on this.state.user   this.body = { secret: '42' }
});

有了如上的代碼,你的 API 就有了 JWT 的保護。如果要訪問這種被保護的接口,需要使用 Authorization Header 來提供 token,比如:

curl --Header "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ" my-website.com

你可能注意到了,JWT 模塊并不依賴任何數據存儲層,這是因為 token 本身是可以單獨被校驗的,token 里面的 payload 甚至可以包含 token 的簽名時間、有效期限。

此外,你還需要確保,所有的 API 接口只能通過更安全的 HTTPS 鏈接來訪問。

7. 學會使用條件請求機制

條件請求機制是基于不同的 Header 表現出不同的行為的機制,可以認為這些 Header 就是請求處理方式的先決條件,如果條件滿足,請求處理方式就會有所不同。

可以利用這些 Header 檢測服務器上的資源版本是否匹配特定的資源版本,這些 Header 的取值可以是如下的內容:

  • 資源的最后修改時間;
  • 資源的標簽(隨資源變化而變化);

具體來說:

  • Last-Modified:標識資源的最新修改時間;
  • Etag:標識資源的標簽;
  • If-Modified-Since:結合 Last-Modified Header 使用;
  • If-Non-Match:結合 Etag 使用;

下面來看一個實際的例子:

客戶端不知道 doc 資源的任何版本,所以請求時即不能提供 If-Modified-Since,也不能提供 If-Non-Match 兩個 Header,然后服務端在響應中會增加 Etag 和 Last-Modified 兩個 Header。

接下來,客戶端再次請求相同的資源的時候,就可以帶上 If-Modified-Since 和 If-Non-Match 這兩個 Header 了,然后如果服務器端會檢查資源是否修改,如果沒有修改,直接返回 304 – Not Modified 狀態碼,而不重復發送資源的內容。

8. 擁抱接口調用頻率限制(Rate-Limiting)

頻率限制是用來控制調用方有對接口發起請求的次數,為了讓你的 API 用戶知道他們還剩下多少余額,可以設置下面的 Header:

  • X-Rate-Limit-Limit:特定時間段內允許的最多請求次數;
  • X-Rate-Limit-Remaining:特定時間段內剩余的請求次數;
  • X-Rate-Limit-Reset:什么時候請求頻率限制次數會重置;

大多數的 WEB 框架都支持上面這些 Header,如果內置不支持,也可以找到插件來支持,比如,如果你使用了 koa,可以使用 koa-rate-limit。

需要注意的是,不同的 API 服務提供商頻率限制的時間窗差異會很大,比如 GitHub 是 60 分鐘,而 Twitter 是 15 分鐘。

9. 編寫良好的 API 文檔

編寫 API 的目的當然是讓別人使用并受益,提供良好的接口文檔至關重要。下面這兩個開源項目可以幫你創建 API 文檔:

如果你愿意使用第三方文檔服務商,可以考慮 Apiary。

10. 對 API 技術演化保持關注

過去幾年中,API 技術方案領域出現了兩種新的查詢語言,分別是 Facebook 的 GraphQL 和 Netflix 的 Falcor,為什么需要他們呢?

試想這種 API 接口請求:/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=10,類似的情況會讓 API 很快失控,如果你希望所有接口能返回類似的響應格式,那么 GraphQL 和 Falcor 就能幫你解決這個問題。

關于 GraphQL

GraphQL 是一種用于 API 的查詢語言,也是一種基于現有數據處理數據查詢的運行時。GraphQL 為您的 API 中的數據提供了一個完整和可理解的描述,使用戶能夠準確地詢問他們需要什么,使得隨著時間推移的 API 演化更容易,GraphQL 還有強大的開發工具支持。 到這里閱讀更多。

關于 Falcor

Falcor 是支撐著 Netflix UI 的創新數據平臺。Falcor 允許你將所有后端數據建模為 Node.js 服務商的單個虛擬 JSON 對象。在客戶端可以使用熟悉的 JavaScript 操作、處理遠程JSON對象。如果你知道你的數據,你就知道你的 API 長啥樣。 到這里閱讀更多。

能帶來靈感的優秀 API 設計

如果你正在開發 Rest API 或者準備改進老版本的 API,這里收集了幾個在線上提供服務、設計優秀并且非常直接借鑒的 API:

希望讀到這里的同學對如何用 Node.js 編寫良好的 API 有更好的理解,如果有建議,歡迎評論中提出。

責任編輯:張燕妮 來源: 王仕軍
相關推薦

2023-12-06 07:13:16

RESTAPI客戶端

2023-04-28 08:42:22

Node.js開源項目

2023-09-12 06:55:27

2021-08-20 09:00:00

Node.js開發API

2023-04-18 15:18:10

2025-03-18 00:10:00

2015-06-24 10:07:34

Java編碼最佳實踐

2023-03-02 19:53:13

DirectusCMS管理

2022-01-07 08:00:00

Node.js開發Web

2024-05-13 13:13:13

APISpring程序

2012-10-29 09:30:47

HadoopHadoop集群Hadoop生態系統包

2024-09-23 00:00:00

下拉菜單UI控件

2012-09-03 10:33:43

2023-08-03 16:14:06

JavaScriptAPI

2023-05-24 12:33:35

2024-11-29 10:00:00

Python日志記錄

2023-11-19 20:16:43

RESTAPIPOST

2016-08-11 14:02:02

NodeJS前端

2022-09-04 15:54:10

Node.jsAPI技巧

2022-11-02 12:17:41

點贊
收藏

51CTO技術棧公眾號

中文久久乱码一区二区| 国产偷自视频区视频一区二区| 欧美性xxxxxx少妇| 在线精品亚洲一区二区| 亚洲国产精品久久久久久久 | 亚洲伊人婷婷| 欧美在线 | 亚洲| 日日欢夜夜爽一区| 欧美大尺度在线观看| 无遮挡aaaaa大片免费看| 久久亚洲精品人成综合网| 亚洲综合一区二区精品导航| 欧美精品久久久| 国产美女主播在线观看| 亚洲自拍另类| 九九热精品视频国产| 公侵犯人妻一区二区三区| 老司机亚洲精品一区二区| 狠狠色狠色综合曰曰| 成年人三级视频| 国产高清视频免费最新在线| 国产高清成人在线| 国产精品成人v| 精品在线免费观看视频| 日本a级不卡| 欧美tk丨vk视频| 国产精品区在线| 欧美1级2级| 亚洲成国产人片在线观看| 正在播放一区| 成人在线观看免费| 97精品国产97久久久久久久久久久久| 91久久精品美女高潮| 在线永久看片免费的视频| 影音先锋久久| 欧美成人免费小视频| av免费播放网站| 亚洲素人在线| 亚洲精品www久久久| 欧美体内she精高潮| www.26天天久久天堂| 色综合久久中文字幕综合网| 日本福利视频一区| av黄在线观看| 国产精品国产三级国产普通话99 | 久久久久国产免费| 亚洲狼人综合| 7799精品视频| 亚洲综合在线一区二区| 日韩三区四区| 欧美人妖巨大在线| 午夜免费高清视频| 日韩一区精品| 欧美色图12p| www.色偷偷.com| 亚洲精品粉嫩美女一区| 色婷婷综合久久久中文一区二区| 女人喷潮完整视频| 欧美a级在线观看| 欧美午夜激情视频| 激情网站五月天| 一呦二呦三呦精品国产| 色久综合一二码| www.欧美日本| 久久免费影院| 欧美精品一级二级三级| 爽爽爽在线观看| 精品视频一区二区三区在线观看| 91麻豆精品国产综合久久久久久 | 俺去了亚洲欧美日韩| 日韩av网站在线播放| 999国产精品999久久久久久| 久久久成人的性感天堂| 欧美日韩国产精品一区二区三区| 狠狠爱www人成狠狠爱综合网| 久久人人看视频| 国产又黄又猛又粗又爽| 免费成人你懂的| 91精品视频在线免费观看| www.亚洲黄色| 91色视频在线| 亚洲综合五月天| 日本片在线观看| 精品久久久久久久久久久久| 日韩亚洲在线视频| 91麻豆精品国产91久久久更新资源速度超快| 91精品国产综合久久精品麻豆| 精品久久久久久无码人妻| 欧美人成在线观看ccc36| 亚洲天堂久久av| av激情在线观看| 国产精品普通话对白| 国产精品日韩一区| 免费成人在线看| 国产日韩欧美精品在线| 在线观看av的网址| 免费观看欧美大片| 欧美一级日韩一级| 蜜桃传媒一区二区亚洲| 91精品一区二区三区综合| 性视频1819p久久| 亚洲视频在线免费播放| 成人免费av资源| 亚洲午夜精品一区二区三区| 黄色污污视频在线观看| 在线观看日韩精品| 又黄又色的网站| 色偷偷综合网| 26uuu久久噜噜噜噜| 国产精品女同一区二区| av电影在线观看一区| 日本福利视频导航| 性欧美18xxxhd| 日韩精品专区在线影院重磅| 国产一二三四五区| 亚洲国产日本| 97中文在线观看| 国产粉嫩一区二区三区在线观看| 一区二区三区美女视频| 一区二区三区视频在线观看免费| 国产精品白丝av嫩草影院| 日韩网站在线观看| 五月婷婷激情视频| 成人免费视频视频| 穿情趣内衣被c到高潮视频| 欧美日韩亚洲国产| 亚洲精品久久久久国产| 久久伊人成人网| 韩国精品在线观看| 亚洲精品一区二| 免费观看成人性生生活片| 亚洲精品动漫100p| 久久精品免费av| 国产美女在线观看一区| 亚洲精品久久久久久一区二区| 在线成人av观看| 亚洲精品www久久久| 中文在线观看免费网站| 国产黄色精品视频| 国产对白在线播放| 欧美视频第一| 综合网中文字幕| 国产又粗又猛又黄视频| 91日韩一区二区三区| 成人免费观看cn| 欧美久久精品| 欧美壮男野外gaytube| 凸凹人妻人人澡人人添| 亚洲成精国产精品女| 99热超碰在线| 亚洲精品色图| 久久精品一二三区| 在线视频超级| 夜夜嗨av色综合久久久综合网| 无码人妻丰满熟妇精品区| 久久精品夜色噜噜亚洲a∨| 日韩欧美精品在线观看视频| 国产九一精品| 国产女人18毛片水18精品| 91吃瓜网在线观看| 欧美欧美欧美欧美首页| 神马午夜精品91| 国产精品夜夜爽| 人体内射精一区二区三区| 韩国女主播一区二区三区| 久久免费视频网站| 欧美午夜黄色| 欧美天堂一区二区三区| 在线观看天堂av| 国产一区二区中文字幕| 日韩一区二区高清视频| 亚洲精品国产精品粉嫩| 国产欧美日韩精品专区| a篇片在线观看网站| 精品欧美一区二区三区精品久久 | 99在线观看免费视频精品观看| 久久久久久亚洲精品不卡4k岛国| 日本欧美日韩| 久久韩剧网电视剧| 高潮一区二区三区乱码| 欧美丝袜一区二区| av片在线免费看| 国产伦精一区二区三区| 美女av免费在线观看| 日本大胆欧美| 成人欧美一区二区三区在线观看 | 在线视频你懂得一区二区三区| 任你操精品视频| 国产成人精品综合在线观看| 欧美日韩亚洲一| 91精品啪在线观看国产81旧版| 国产一区二区三区高清视频| 成人亚洲网站| 欧美精品videosex性欧美| 国产免费视频在线| 日韩欧美的一区二区| 伊人中文字幕在线观看| 亚洲精品va在线观看| 能免费看av的网站| 国产激情偷乱视频一区二区三区| www.国产区| 国内精品久久久久国产盗摄免费观看完整版| 久久久久免费网| 亚洲视频国产| 国产欧美韩国高清| 三妻四妾的电影电视剧在线观看| y97精品国产97久久久久久| 手机看片一区二区三区| 制服丝袜亚洲播放| 国产一区二区视频免费| 午夜精品一区二区三区免费视频| 女人裸体性做爰全过| 99久久久无码国产精品| 夜夜爽久久精品91| 美女脱光内衣内裤视频久久网站| 国产免费黄视频| 很黄很黄激情成人| 中国成人亚色综合网站| 欧美肉体xxxx裸体137大胆| 国产美女精品在线观看| 精品国产乱码一区二区三区| 国产精品亚发布| 成人欧美大片| 97国产精品视频人人做人人爱| av免费在线观| 久久精品在线视频| 亚洲搞黄视频| 国产一区二区成人| 欧美美女搞黄| 亚洲精品电影在线| 视频一区二区免费| 亚洲国产成人久久综合| 亚洲第一天堂影院| 欧美一二三四区在线| 国产又大又粗又硬| 欧美日本韩国一区二区三区视频| 中文字幕一区二区三区四区视频 | 日韩av自拍偷拍| 蜜臀av一区二区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 91香蕉视频污在线| 欧美夫妇交换xxx| 北岛玲一区二区三区四区| 国产chinesehd精品露脸| 国产v日产∨综合v精品视频| 成人高清在线观看视频| 国产在线视视频有精品| 天天综合成人网| 国产中文字幕一区| 久久精品亚洲天堂| 国产在线精品一区二区三区不卡 | av一级久久| 亚洲在线第一页| 老司机亚洲精品一区二区| 亚洲自拍另类欧美丝袜| 无码国模国产在线观看| 999日本视频| 国产色噜噜噜91在线精品| 国产伦视频一区二区三区| 偷拍亚洲精品| 日韩电影大全在线观看| 色婷婷一区二区三区| 潘金莲一级淫片aaaaa免费看| 国产一区二区三区自拍| 日本十八禁视频无遮挡| 欧美亚洲自偷自偷| 91色国产在线| 国产精品一二三四| 黑丝av在线播放| 国产人成亚洲第一网站在线播放| 国产在线免费看| 亚洲一区二区三区四区不卡| 草久久免费视频| 欧美日韩在线免费视频| 国产xxxx在线观看| 亚洲精品国产精品乱码不99按摩| 国产精品一区二区三区四区色 | 91超碰国产在线| 日韩av手机在线看| 婷婷成人av| 国产女主播一区二区三区| 国产中文精品久高清在线不| 超碰97免费观看| 99av国产精品欲麻豆| 九九热免费在线观看| 99国内精品久久| 亚洲 欧美 国产 另类| 亚洲午夜日本在线观看| 一级久久久久久| 精品日韩一区二区三区免费视频| 久久久久久久久亚洲精品| 不卡av电影在线观看| 无码小电影在线观看网站免费| 国产精自产拍久久久久久| 一区二区亚洲视频| 亚洲国产欧洲综合997久久| 国产精品多人| 爱爱爱爱免费视频| 91天堂素人约啪| 中日韩一级黄色片| 欧美日韩综合视频| 国产成人a人亚洲精品无码| 亚洲视频在线观看网站| 黄色美女视频在线观看| 国产精品入口尤物| 伊人久久影院| 亚洲欧美电影在线观看| 亚洲深爱激情| 五月天六月丁香| 亚洲国产岛国毛片在线| 亚洲精品www久久久久久| 日韩亚洲欧美中文三级| av在线中文| 人妖精品videosex性欧美| 麻豆精品国产| 在线视频福利一区| 久久最新视频| 手机在线看片日韩| 一区二区三区高清| 国产美女www爽爽爽视频| 亚洲人成在线电影| 美女露胸视频在线观看| 99精品国产一区二区| 国产精品二区不卡| 污色网站在线观看| 国产婷婷精品av在线| 69成人免费视频| 亚洲国产精品嫩草影院久久| 丝袜国产在线| 亚洲精品日韩av| 国产精品久久久久久麻豆一区软件| 欧美精品成人网| 久久久精品人体av艺术| 日韩污视频在线观看| 精品奇米国产一区二区三区| 牛牛精品视频在线| 99re在线视频观看| 国产精品v一区二区三区| 中文字幕avav| 亚洲欧美视频在线观看| 国产美女明星三级做爰| 久久精品久久久久久| 四虎视频在线精品免费网址| 中文字幕一区二区三区有限公司 | 午夜国产欧美理论在线播放| 男人午夜视频在线观看| 亚洲天堂网中文字| 国产绿帽一区二区三区| 久久久精品美女| 香蕉大人久久国产成人av| 三级在线免费观看| 国产高清久久久| 精品少妇久久久| 亚洲精品成人久久久| 最新欧美色图| 午夜精品一区二区三区四区| 免费久久精品视频| 日韩激情小视频| 精品剧情v国产在线观看在线| 丁香花视频在线观看| 欧美高清性xxxxhd | 亚洲国产精品影院| 色一情一乱一区二区三区| 欧美在线不卡区| 欧美一级淫片| 日本高清免费观看| 激情久久av一区av二区av三区| 无码精品人妻一区二区| 国产a级全部精品| 天天综合精品| 天天躁日日躁狠狠躁av麻豆男男 | 在线观看的毛片| 亚洲人成精品久久久久久| 亚洲国产精品无码久久| 欧美亚洲视频在线观看| 成人一级毛片| 色婷婷狠狠18禁久久| 午夜精品爽啪视频| 在线国产91| 国产精品一区二区三区不卡| 嫩草成人www欧美| 熟女少妇a性色生活片毛片| 精品日本一线二线三线不卡| 欧美影视资讯| 成人在线免费观看视频网站| 91在线视频18| 国产精品国产一区二区三区四区| 欧美高清视频在线播放| 欧美美女在线观看| 亚洲精品在线网址| 欧美性videos高清精品| 国产黄网站在线观看| 久久久综合香蕉尹人综合网| 精品一区二区免费看| 日本网站免费观看| 中文字幕在线精品| 99久久婷婷国产综合精品青牛牛| 日本熟妇人妻中出| 亚洲成人资源在线| 日本中文字幕电影在线免费观看|