十个书写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,如果一切都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的最佳实践(下)》

原文链接:

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏编程

经典的20道AJAX

1、什么是AJAX,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax: AJAX是“Asynchronous JavaScript and X...

1937
来自专栏星回的实验室

JavaScript中的沙箱机制探秘[二]:iFrame沙箱实现方案详解

在上一篇文中,我们接触了JavaScript中的sandbox的概念,并且就现阶段的一些实现思路做了总结,包括YUI的闭包、iframe的sandbox以及No...

1361
来自专栏我和PYTHON有个约会

爬虫 0030~ requests利刃出鞘

requests第三方封装的模块,通过简化请求和响应数据的处理,简化繁琐的开发步骤和处理逻辑、统一不同请求的编码风格以及高效的数据处理特性等而风靡于爬虫市场。

741
来自专栏阮一峰的网络日志

URL的井号

在我印象中,这是主流网站第一次将"#"大规模用于直接与用户交互的关键URL中。这表明井号(Hash)的作用正在被重新认识。本文根据HttpWatch的文章,整理...

812
来自专栏数据小魔方

异步加载的基本逻辑与浏览器抓包一般流程

本篇内容不涉及任何R语言或者Python代码实现,仅从异步加载的逻辑实现过程以及浏览器抓包分析的角度来给大家分享一下个人近期学习爬虫的一些心得。 涉及到的工具有...

3174
来自专栏竹清助手

深入理解什么是RESTful API ?

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hig...

582
来自专栏Keegan小钢

App架构经验总结(一)

原文链接:http://keeganlee.me/post/architecture/20160303 版权声明:本文刊载在《程序员》杂志2016年3期,版权归...

1194
来自专栏后端技术探索

Nginx如何做流量控制

英文原文:https://www.nginx.com/blog/rate-limiting-nginx/

1534
来自专栏Flutter入门到实战

深入理解什么是RESTful API ?

越来越多的人开始意识到,网站即软件,而且是一种新型的软件。   这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(hi...

1062
来自专栏安智客

GP规范中定义的四种SE访问控制架构

GP规范给人的感觉好像有点晦涩难懂,由于是规范,所以比较抽象,而且GP这个组织的专家们来自世界各地,大家都用英语文档交流,所以不同的文档风格不同,难免大家阅读起...

962

扫码关注云+社区