十个书写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 条评论
登录 后参与评论

相关文章

来自专栏MoeLove

[译]Tornado4.3-用户指南

Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同...

834
来自专栏Web 开发

《Node.js开发指南》翻阅笔记

第一天上班,配套的电脑居然没有到货,无聊了一天,就把《Node.js开发指南》拿出来翻了一下。

580
来自专栏IT大咖说

送给前端的你:可视化快速生成模拟数据服务——Easy Mock

? 内容来源:2017年11月18日,大搜车前端工程师高攀在“2017中国开源年会”进行《Easy Mock 接口数据模拟服务》演讲分享。IT 大咖说(微信i...

3626
来自专栏杨建荣的学习笔记

Oracle 12.1升级到12.2的两种方法(r12笔记第92天)

自Oracle 12.2发布以来,就会面临两类升级的需求,一类是12.1升级到12.2,毕竟12.1和12.2的发布时间间隔有5年左右的时间,这个时间段内已...

3445
来自专栏技巅

linux内核崩溃问题排查过程总结

1414
来自专栏机器学习算法与Python学习

Python中常用的一些架构

在各种语言平台中,python涌现的web框架恐怕是最多的,是一个百花齐放的世界,各种micro-framework、framework不可胜数;猜想原因应该是...

3334
来自专栏程序员Gank

Android工程模块化平台的设计

首先自我介绍一下:我叫张涛,目前就职于饿了么移动技术部。可能有些朋友认识我,我之前也会在我博客【开源实验室】写一些Android相关的技术点。

633
来自专栏代码拾遗

那些值得一用的JS库

如果你是一个npm作者,强烈推荐使用np模块,它能为你轻而易举地解决更新版本、添加git发布tag和发布代码到npm,特别是当你有很多npm模块要维护的时候。

1043
来自专栏带你撸出一手好代码

神奇的Java

使用java开发一个socket服务器,使用protocol buffer作为和客户端通信的数据格式。然后,问题就来了,这个socket服务器要如何调试?换句话...

502
来自专栏MasiMaro 的技术博文

Windows数据库编程接口简介

数据库是计算机中一种专门管理数据资源的系统,目前几乎所有软件都需要与数据库打交道(包括操作系统,比如Windows上的注册表其实也是一种数据库),有些软件更是以...

682

扫码关注云+社区