精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

中文一区一区三区高中清不卡| 一本一本久久| 日韩视频免费观看高清完整版在线观看| 色乱码一区二区三区熟女| 国产福利第一视频| 亚洲欧美卡通另类91av| 色老头一区二区三区| 国产免费a级片| 国产成人精品123区免费视频| 亚洲视频免费在线观看| 久久久久久久久久久久久久一区 | 日韩国产精品91| 久久人体大胆视频| 97香蕉碰碰人妻国产欧美 | 色88888久久久久久影院按摩| 亚洲精品一区二区三区av| 亚洲爱情岛论坛永久| 日韩av电影一区| 欧美极品少妇xxxxx| 日本爱爱爱视频| 精品人人人人| 欧美挠脚心视频网站| 欧美日韩黄色一级片| 国产在线高清理伦片a| www.亚洲人| 亚洲r级在线观看| 一级久久久久久| 亚洲大黄网站| 九九精品在线观看| 国产又粗又硬视频| 色老板在线视频一区二区| 91精品国产欧美日韩| 日韩中文字幕免费在线| xxx性欧美| 亚洲精品亚洲人成人网在线播放| 婷婷久久青草热一区二区| 日批免费在线观看| 国产一区高清在线| 国产精品自产拍在线观| 一级片免费在线播放| 亚洲高清免费| 欧美激情一级欧美精品| 欧美激情图片小说| 91久久电影| 日韩在线欧美在线| 国产又黄又粗视频| 成人羞羞网站| 在线看日韩欧美| av男人的天堂av| 加勒比久久综合| 精品亚洲精品福利线在观看| 国产精品麻豆入口| 超碰成人在线观看| 精品久久一区二区| 中文在线字幕观看| 999久久精品| 亚洲国产日韩精品在线| 日本一区二区在线观看视频| 爱高潮www亚洲精品| 日韩免费视频一区| 农村末发育av片一区二区 | 91精品国产综合久久久蜜臀粉嫩 | 久久成人国产精品| 中文字幕在线2021| 欧美日韩成人| 97精品国产97久久久久久春色| 久久久一区二区三区四区| 欧美日韩一区二区国产| 欧美黑人xxx| 日韩毛片在线视频| 久久福利精品| 国产精品久久久久9999| 中文字幕在线观看精品| 麻豆国产欧美日韩综合精品二区| 成人网在线观看| 亚洲av少妇一区二区在线观看| 成人国产精品免费观看视频| 国产一区精品视频| 国产免费av在线| 中文字幕制服丝袜一区二区三区 | 黑人极品ⅴideos精品欧美棵| 亚洲尤物视频在线| 国内外成人激情视频| 色尼玛亚洲综合影院| 欧美日韩一卡二卡| 日韩精品xxx| 西野翔中文久久精品字幕| 尤物九九久久国产精品的分类| 青青青手机在线视频| 欧美日韩视频| 国产成人精品久久亚洲高清不卡| 91麻豆成人精品国产| 成人国产在线观看| 亚洲国产精品毛片| 狂野欧美性猛交xxxxx视频| 狠狠色香婷婷久久亚洲精品| 三级在线视频观看| swag国产精品一区二区| 一区二区三区久久精品| 日韩在线中文字幕视频| 毛片一区二区| 91精品久久久久久蜜桃| 青青草在线免费视频| 亚洲色图欧美偷拍| 国产精品免费入口| 国产精品一区二区三区av| 亚洲精品视频二区| 免费在线黄色网| 日韩精品亚洲专区| 国产精品国模大尺度私拍| av资源在线观看免费高清| 亚洲制服欧美中文字幕中文字幕| 天天操,天天操| 欧美美女在线直播| 欧美区在线播放| 中文字幕二区三区| 91日韩在线专区| 欧美美女黄色网| 成人国产网站| 日韩理论片久久| 国产一级一级片| 久久精品国产999大香线蕉| 久久久综合香蕉尹人综合网| 欧美男男video| 欧美猛男超大videosgay| 中文字幕xxx| 亚洲激情不卡| 成人免费网站在线观看| 丁香在线视频| 日韩欧美精品在线观看| 久久久午夜精品福利内容| 在线中文字幕第一区| 国产精品欧美日韩一区二区| 亚洲色图21p| 精品国产91久久久久久老师| 免费看三级黄色片| 一区二区中文| 国产精品一区二区三区久久| 成年人视频在线看| 91久久久免费一区二区| 91成年人网站| 日韩香蕉视频| 久久伊人一区| 一个人看的www视频在线免费观看| 欧美精品一区二区三区很污很色的| 五月综合色婷婷| 激情图区综合网| 欧美日韩亚洲国产成人| 日本a人精品| xxx一区二区| 99久久精品无免国产免费| 亚洲日本一区二区| 无码国产精品一区二区高潮| 欧美日韩免费| 国产精品一区在线播放| 高清精品在线| 精品亚洲一区二区| 国产精品无码粉嫩小泬| 欧美激情一二三区| 五月天中文字幕在线| 91精品国产91久久久久久密臀| 国产欧美va欧美va香蕉在线| 日本在线免费中文字幕| 欧美一级高清大全免费观看| 久草视频中文在线| 国产精一品亚洲二区在线视频| 少妇久久久久久被弄到高潮| 爱高潮www亚洲精品| 5566成人精品视频免费| 黄色片在线免费看| 欧美日韩国产免费一区二区| 日韩视频中文字幕在线观看| 国产乱对白刺激视频不卡| 精品国产av无码一区二区三区| 激情亚洲另类图片区小说区| 日av在线播放中文不卡| 成人高清网站| 91精品国模一区二区三区| 五月天综合在线| 久久精品这里都是精品| 久热精品在线播放| 午夜亚洲福利| 欧美视频1区| 精品视频一二| 2019中文字幕全在线观看| 国产www.大片在线| 日韩西西人体444www| 日韩乱码在线观看| 国产精品国产三级国产aⅴ入口 | 国产日韩亚洲欧美综合| 免费高清视频在线观看| 日韩一级大片| 一区二区三区观看| 麻豆一区二区麻豆免费观看| 国产精品久久综合av爱欲tv| 牛牛精品在线| 一区二区三区美女xx视频| 亚洲爆乳无码一区二区三区| 欧美伊人久久久久久久久影院| 国内偷拍精品视频| 国产网站一区二区三区| 国产成人av片| 老鸭窝一区二区久久精品| 91动漫在线看| 国产韩日影视精品| 久久久久久久久久久久久9999| 成人污版视频| 国产精品青青在线观看爽香蕉| 18video性欧美19sex高清| 日韩在线高清视频| 嫩草研究院在线观看| 亚洲成人精品视频在线观看| 亚洲天堂中文网| 日韩欧美亚洲综合| 久草中文在线视频| 国产精品乱人伦| 欧美狂猛xxxxx乱大交3| 成人午夜私人影院| 婷婷中文字幕在线观看| 日韩和的一区二区| 一二三四视频社区在线| 夜间精品视频| 一区二区在线观看网站| 成人无号精品一区二区三区| 欧美高清性xxxxhdvideosex| 美国十次av导航亚洲入口| 91综合免费在线| 欧美黄页在线免费观看| 国产精品久久久久久一区二区 | 日韩欧美大尺度| 欧美一级高潮片| 亚洲精品老司机| 精品少妇一区二区三区密爱| 91美女福利视频| 日韩www视频| 丁香亚洲综合激情啪啪综合| 国产精久久久久| 国产91精品露脸国语对白| 少妇性l交大片7724com| 国产一区 二区 三区一级| а 天堂 在线| 国产在线播放一区| 亚洲国产欧美日韩在线| 国产精品一区2区| 中文字幕人妻无码系列第三区| 国产在线国偷精品产拍免费yy| 小明看看成人免费视频| 麻豆精品在线观看| 手机av在线免费| 国产在线播放一区三区四| 国产黑丝在线视频| 国产伦精品一区二区三区免费| 天天久久综合网| 国产精品一区久久久久| 永久免费看片在线观看| 国产超碰在线一区| 日韩少妇一区二区| 91色婷婷久久久久合中文| 日韩网站在线播放| 久久青草欧美一区二区三区| 久久久久久久毛片| 中文字幕一区二区三区四区| 国产精品99久久久久久成人| 亚洲女人小视频在线观看| 麻豆成人在线视频| 都市激情亚洲色图| 亚洲大尺度在线观看| 欧美美女直播网站| 精品国产无码一区二区三区| 精品久久久久一区| 人妻一区二区三区四区| 日韩高清有码在线| 日产精品久久久久久久性色| 在线日韩欧美视频| 性开放的欧美大片| 久热在线中文字幕色999舞| av在线理伦电影| 欧洲精品久久久| 成人av影院在线观看| 欧美一级bbbbb性bbbb喷潮片| 一区二区电影免费观看| 91精品国产自产91精品| 日日夜夜天天综合| 国产欧美亚洲精品| 日韩久久一区| 国产伦精品一区二区三区| 欧美大胆视频| 日本精品一区二区| 国产精品久久久久久久久久10秀| 中文字幕综合在线观看| 一本一本久久| 日本肉体xxxx裸体xxx免费| 国产精品一区二区视频| 成人网站免费观看| 国产精品久线在线观看| 久久久久久久久久综合 | 日韩国产欧美亚洲| 可以看av的网站久久看| 日本美女视频一区| 成人国产在线观看| 国产熟妇搡bbbb搡bbbb| 一区二区三区在线观看欧美| 久久国产视频播放| 在线播放欧美女士性生活| 人妻无码中文字幕| 中文国产成人精品| 美女扒开腿让男人桶爽久久软| 国产精品福利片| 2023国产精华国产精品| 亚洲人成影视在线观看| 在线观看一区| 婷婷六月天在线| 91色.com| 麻豆changesxxx国产| 91精品综合久久久久久| 毛片免费在线| 国产+成+人+亚洲欧洲| 九九99久久精品在免费线bt| 欧美国产综合视频| 亚洲巨乳在线| 91小视频在线播放| 国产色婷婷亚洲99精品小说| xxxx.国产| 精品日韩欧美在线| 超碰国产在线观看| 日韩av电影免费观看高清| 在线精品视频一区| 福利在线小视频| 日本欧美加勒比视频| free性中国hd国语露脸| 亚洲五码中文字幕| 国产麻豆免费观看| 一本色道久久88精品综合| 制服丝袜专区在线| 国产伦精品一区二区三区| 狠狠爱www人成狠狠爱综合网| 国产一伦一伦一伦| 国产日韩成人精品| 亚洲免费视频二区| 亚洲成人999| 秋霞在线视频| 91老司机精品视频| 午夜精品婷婷| 中文字幕日韩综合| 国产精品福利一区二区三区| 国产男人搡女人免费视频| 日韩久久免费电影| 另类激情视频| 免费看成人片| 亚洲黄页一区| 久久久久亚洲av无码专区桃色| 亚洲国产日韩一区二区| 特级丰满少妇一级aaaa爱毛片| 久久久久国色av免费观看性色 | 国产区在线观看| 国产在线精品播放| 综合一区在线| 亚洲三级在线观看视频| 亚洲美女视频在线观看| 国产精品久久久久久无人区| 日韩在线观看高清| 日韩一级特黄| 日韩在线观看电影完整版高清免费| 日韩av在线播放中文字幕| 色撸撸在线视频| 91精品国产入口| 青草影视电视剧免费播放在线观看| 91精品国产自产在线| 综合国产在线| 国产免费a级片| 色噜噜狠狠一区二区三区果冻| 欧美日韩在线中文字幕| 国产精品久久视频| 国产精品99在线观看| aaaaaaaa毛片| 午夜国产精品一区| 香蕉视频成人在线| 国产精品免费在线免费 | 91一区二区在线| 亚洲va在线观看| 亚洲一区二区黄| 日韩毛片网站| 成人免费看片'免费看| 91在线云播放| 中文字幕欧美在线观看| 久久91超碰青草是什么| 久久激情av| 久色视频在线播放| 国产欧美日韩激情| 国产乱叫456在线| 久久久久久国产免费| 香蕉久久夜色精品国产更新时间| 日韩 欧美 高清| 一区二区三区免费| 完全免费av在线播放| 全部免费毛片在线播放一个| 日本精品一区二区三区在线播放视频| 成人国产精品一级毛片视频| 性感美女一区二区三区| 一本久道中文字幕精品亚洲嫩|