收录待用,修改转载已取得腾讯云授权


原文:10 Best Practices for Writing Node.js REST APIs

我们会通过本文介绍下书写Node.js REST API的最佳实践,包括各个主题,像是命名路由、认证、黑盒测试以及对相关资源使用合适的缓存头。

对于Node.js来说最流行的一个用例就是用其来书写RESTful API。尽管如此,当我们使用监控工具来帮助用户排查问题时,我们总是能感受到在REST API上开发者们有很多的问题。

我希望这些最佳实践能够对你有所帮助。

1. 使用HTTP方法和API路由

设想一下你正在构建Node.js RESTful API用以用来创建、更新、获取或者删除用户。这些操作HTTP已经有可以胜任的工具集:POST,PUT, GET, PATCHDELETE

作为最佳实践,你的API路由应该一直使用名词作为资源id。涉及到用的资源相关的,路由机制也可以这样:

  • POST /user 或者 PUT /user:/id 来创建新用户

  • GET /user 来获取列表的用户

  • GET /user/:id 来获得某一个用户

  • PATCH /user/:id 来修改已有的用户记录

  • DELETE /user/:id 来删除一个用户

2. 正确地使用HTTP状态码

如果处理请求时出了问题,你必须在响应里设置正确的状态码:

  • 2xx,如果一切都ok

  • 3xx,如果资源被移除

  • 4xx,如果因为服务器错误导致请求无法实现 (例如请求一个不存在的资源)

  • 5xx, 如果API测出现问题 (例如异常发生)

如果你正在使用Express,设置状态码就是这么简单 res.status(500).send({error: 'Internal server error happened'})。 和使用Restify很类似:res.status(201).

查看list of HTTP status codes以寻求完整列表

3.使用HTTP头来设置Medata

使用HTTP头把metadata加到要发送的负载上。像这样的头可以是在如下信息的上:

  • 页码

  • 速率限制

  • 或者是认证.

标准化HTTP头的列表可以在 这里被找到。

如果你需要在你的相应头里面设置任何自定义的metadata,给它们加上X前缀是最佳实践。例如,之前如果你在使用CSRF token时,把其命名为X-Csrf-Token是很普遍(但不标准)的做法。无论如何随着RFC 6648的发布,这些都已经被废弃了。新API最好不要使用会和其他应用发生冲突的header名。例如,OpenStack在它们的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,这会导致嵌入机一直缓冲”

来自Node.js HTTP 解析器

4 为你的Node.js REST API挑选合适的框架

挑选最适合你用例的框架是很重要的。

Express, Koa 亦或是 Hapi

ExpressKoaHapi 可以被用来创造浏览器应用,同样的,它们支持模版和渲染 —— 只需要来命名几个特性。如果你的应用也需要提供用户界面,使用它们很有必要。

Restify

另一方面,Restify致力于帮助你构建REST服务。其存在的意思便在于让你构建“严格的”可维护可观察的API服务。Restify同样可以和自动化的DTrace协作支持你所有的handler。

Restify主要被用于像npm或者Netflix的应用生产里。

接下篇《十个书写Node.js REST API的最佳实践(下)》


原文链接:https://www.qcloud.com/community/article/266459

十个书写Node.js REST API的最佳实践(上)的更多相关文章

  1. 十个书写Node.js REST API的最佳实践(下)

    收录待用,修改转载已取得腾讯云授权 5. 对你的Node.js REST API进行黑盒测试 测试你的REST API最好的方法之一就是把它们当成黑盒对待. 黑盒测试是一种测试方法,通过这种方法无需知 ...

  2. 编写 Node.js Rest API 的 10 个最佳实践

    Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...

  3. AngularJS 授权 + Node.js REST api

    作者好屌啊,我不懂的他全都懂. Authentication with AngularJS and a Node.js REST api 几个月前,我开始觉得 AngularJS 好像好牛逼的样子,于 ...

  4. Node.js RESTful API

    什么是REST架构? REST表示代表性状态传输.REST是一种基于Web标准的架构,并使用HTTP协议. 它都是围绕着资源,其中每一个组件是资源和一个资源是由一个共同的接口使用HTTP的标准方法获得 ...

  5. Practical Node.js (2018版) 第8章:Building Node.js REST API Servers

    Building Node.js REST API Servers with Express.js and Hapi Modern-day web developers use an architec ...

  6. Node.js 常用 API

    Node.js v6.11.2  Documentation(官方文档) Buffer Prior to the introduction of TypedArray in ECMAScript 20 ...

  7. 使用Node.js原生API写一个web服务器

    Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...

  8. node.js使用express框架进行文件上传

    关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...

  9. (转)RESTful API 设计最佳实践

    原文:http://www.oschina.net/translate/best-practices-for-a-pragmatic-restful-api 数据模型已经稳定,接下来你可能需要为web ...

随机推荐

  1. 网站优化:引用CDN公共库

    什么是CDN公共库? CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一般的CDN公共库都会包含全球所有最流行的 ...

  2. 用vue-wechat-title为微信动态设置标题

    1.安装插件 cnpm install vue-wechat-title --save 2.在main.js中引入 Vue.use(require('vue-wechat-title')) 3.在路由 ...

  3. 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字

    题目描述 tabris实在是太菜了,没打败恶龙,在绿岛也只捡到一块生铁回去了,为了不在继续拉低acimo星球的平均水平逃离地球,来到了Sabi星球. 在这里tabris发现了一种神奇的生物,这种生物不 ...

  4. 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]

    题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...

  5. 【数学】At Coder 091 D题

    [深夜题解] 题目链接:https://arc091.contest.atcoder.jp/tasks/arc091_b 题目大意:给出两个正整数N.K,找出所有的不大于N的正整数对(a,b)使b%a ...

  6. JSP之登录验证码

    1.JSP页面中设置输入选项和验证码 <form action=login.do" method="post" > <div class="l ...

  7. supervisor控制台运行出错,BACKOFF Exited too quickly

    需要把虚拟环境中的flask路径导入,我这里是 export PYTHONPATH=$PYTHONPATH:/root/FlaskWebDevelopment/venv/lib/python2.7/s ...

  8. 2018/3/18 noip模拟赛 20分

    T1 dp,特别裸特别简单,我放弃了写了个dfs. T2 树归,特别裸特别简单,我不会写. T3 贪心二分不知道什么玩意儿反正不会写就对了. 我是个智障

  9. [CODECHEF]EASYEX

    题意:有一个$k$面的骰子,上面的数字为$1\cdots k$,现在要丢$n$次骰子,设$n$次中有$a_i$次扔到数字$i$,给定$l,f$,求$\prod\limits_{i=1}^la_i^f$ ...

  10. 【最小表示法】BZOJ2882-工艺

    [题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法模板题.之前用SAM做的,MLE了hhhhh戳☆ #include<iostream> #include<cstdio ...