十个书写Node.js REST API的最佳实践(上)
收录待用,修改转载已取得腾讯云授权
原文: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, PATCH 或 DELETE。
作为最佳实践,你的API路由应该一直使用名词作为资源id。涉及到用的资源相关的,路由机制也可以这样:
POST /user或者PUT /user:/id来创建新用户GET /user来获取列表的用户GET /user/:id来获得某一个用户PATCH /user/:id来修改已有的用户记录DELETE /user/:id来删除一个用户
2. 正确地使用HTTP状态码
如果处理请求时出了问题,你必须在响应里设置正确的状态码:
2xx,如果一切都ok3xx,如果资源被移除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,这会导致嵌入机一直缓冲”
4 为你的Node.js REST API挑选合适的框架
挑选最适合你用例的框架是很重要的。
Express, Koa 亦或是 Hapi
Express,Koa和Hapi 可以被用来创造浏览器应用,同样的,它们支持模版和渲染 —— 只需要来命名几个特性。如果你的应用也需要提供用户界面,使用它们很有必要。
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的最佳实践(上)的更多相关文章
- 十个书写Node.js REST API的最佳实践(下)
收录待用,修改转载已取得腾讯云授权 5. 对你的Node.js REST API进行黑盒测试 测试你的REST API最好的方法之一就是把它们当成黑盒对待. 黑盒测试是一种测试方法,通过这种方法无需知 ...
- 编写 Node.js Rest API 的 10 个最佳实践
Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由.进行认证和测试等话题,内容摘要如下 ...
- AngularJS 授权 + Node.js REST api
作者好屌啊,我不懂的他全都懂. Authentication with AngularJS and a Node.js REST api 几个月前,我开始觉得 AngularJS 好像好牛逼的样子,于 ...
- Node.js RESTful API
什么是REST架构? REST表示代表性状态传输.REST是一种基于Web标准的架构,并使用HTTP协议. 它都是围绕着资源,其中每一个组件是资源和一个资源是由一个共同的接口使用HTTP的标准方法获得 ...
- 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 ...
- Node.js 常用 API
Node.js v6.11.2 Documentation(官方文档) Buffer Prior to the introduction of TypedArray in ECMAScript 20 ...
- 使用Node.js原生API写一个web服务器
Node.js是JavaScript基础上发展起来的语言,所以前端开发者应该天生就会一点.一般我们会用它来做CLI工具或者Web服务器,做Web服务器也有很多成熟的框架,比如Express和Koa.但 ...
- node.js使用express框架进行文件上传
关于node.js使用express框架进行文件上传,主要来自于最近对Settings-Sync插件做的研究.目前的研究算是取得的比较好的进展.Settings-Sync中通过快捷键上传文件,其实主要 ...
- (转)RESTful API 设计最佳实践
原文:http://www.oschina.net/translate/best-practices-for-a-pragmatic-restful-api 数据模型已经稳定,接下来你可能需要为web ...
随机推荐
- 网站优化:引用CDN公共库
什么是CDN公共库? CDN公共库是指将常用的JS库存放在CDN节点,以方便广大开发者直接调用.与将JS库存放在服务器单机上相比,CDN公共库更加稳定.高速.一般的CDN公共库都会包含全球所有最流行的 ...
- 用vue-wechat-title为微信动态设置标题
1.安装插件 cnpm install vue-wechat-title --save 2.在main.js中引入 Vue.use(require('vue-wechat-title')) 3.在路由 ...
- 哈尔滨理工大学第七届程序设计竞赛决赛(网络赛-高年级组)I - 没有名字
题目描述 tabris实在是太菜了,没打败恶龙,在绿岛也只捡到一块生铁回去了,为了不在继续拉低acimo星球的平均水平逃离地球,来到了Sabi星球. 在这里tabris发现了一种神奇的生物,这种生物不 ...
- 洛谷P1486 [NOI2004]郁闷的出纳员 [STL,平衡树]
题目传送门 郁闷的出纳员 题目描述 OIER公司是一家大型专业化软件公司,有着数以万计的员工.作为一名出纳员,我的任务之一便是统计每位员工的工资.这本来是一份不错的工作,但是令人郁闷的是,我们的老板反 ...
- 【数学】At Coder 091 D题
[深夜题解] 题目链接:https://arc091.contest.atcoder.jp/tasks/arc091_b 题目大意:给出两个正整数N.K,找出所有的不大于N的正整数对(a,b)使b%a ...
- JSP之登录验证码
1.JSP页面中设置输入选项和验证码 <form action=login.do" method="post" > <div class="l ...
- supervisor控制台运行出错,BACKOFF Exited too quickly
需要把虚拟环境中的flask路径导入,我这里是 export PYTHONPATH=$PYTHONPATH:/root/FlaskWebDevelopment/venv/lib/python2.7/s ...
- 2018/3/18 noip模拟赛 20分
T1 dp,特别裸特别简单,我放弃了写了个dfs. T2 树归,特别裸特别简单,我不会写. T3 贪心二分不知道什么玩意儿反正不会写就对了. 我是个智障
- [CODECHEF]EASYEX
题意:有一个$k$面的骰子,上面的数字为$1\cdots k$,现在要丢$n$次骰子,设$n$次中有$a_i$次扔到数字$i$,给定$l,f$,求$\prod\limits_{i=1}^la_i^f$ ...
- 【最小表示法】BZOJ2882-工艺
[题目大意] 求一个循环数列的最小表示法. [思路] 最小表示法模板题.之前用SAM做的,MLE了hhhhh戳☆ #include<iostream> #include<cstdio ...