正确的方法来设置响应状态和JSON内容的REST API使用nodejs和express
我正在玩Nodejs,并通过构build一个小的restAPI来expression。 我的问题是,设置代码状态以及响应数据的最佳做法/最佳方法是什么?
让我用一点代码解释一下(我不会把启动服务器所需的节点和expression式代码,只是所关心的路由器方法):
router.get('/users/:id', function(req, res, next) { var user = users.getUserById(req.params.id); res.json(user); }); exports.getUserById = function(id) { for (var i = 0; i < users.length; i++) { if (users[i].id == id) return users[i]; } };
下面的代码完美的工作,当发送邮递员的请求时,我得到以下结果:
正如你所看到的,状态显示200,这是OK的。 但这是做到这一点的最好方法吗? 有没有这样的情况,我应该自己设置状态,以及返回的JSON? 还是总是用快递处理?
例如,我刚做了一个快速testing,稍微修改了上面的get方法:
router.get('/users/:id', function(req, res, next) { var user = users.getUserById(req.params.id); if (user == null || user == 'undefined') { res.status(404); } res.json(user); });
正如你所看到的,如果用户没有在数组中find,我将只设置404的状态。
资源/build议,以了解更多关于这个话题是值得欢迎的。
Express API参考涵盖了这种情况: http : //expressjs.com/4x/api.html#res.send 。
简而言之,在调用json
或send
之前,您只需调用status
方法:
res.status(500).send({ error: "boo:(" });
当使用res.send
, res.json
等时,200的状态将成为默认值。
你可以设置状态像res.status(500).json({ error: 'something is wrong' });
我经常会做点像…
router.get('/something', function(req, res, next) { // Some stuff here if(err) { res.status(500); return next(err); } // More stuff here });
然后让我的错误中间件发送响应,并在发生错误时执行其他任何我需要的操作。
另外: res.sendStatus(status)
已被添加到版本4.9.0 http://expressjs.com/4x/api.html#res.sendStatus
你可以这样做:
res.status(400).json(json_response);
这会将HTTP状态码设置为400,即使在快递4中也是如此。
我build议阅读REST-ful URI Design和一个HTTP状态码列表
有关状态响应的良好做法是,根据错误发送正确的HTTP状态代码(客户端错误4xx,服务器错误5xx),关于实际的JSON响应,没有“圣经”,但是一个好主意可能是在成功的响应中发送(再次)作为根对象的2个不同属性的状态和数据(这样你就可以让客户端有机会从HTTP头部和有效载荷本身捕获状态)以及解释在出现错误的情况下以人类可以理解的方式出错。
Stripe的 API在现实世界中的行为类似。
即
好
200, {status: 200, data: [...]}
错误
400, {status: 400, data: null, message: "You must send foo and bar to baz..."}
我在我的Express.js应用程序中使用这个:
app.get('/', function (req, res) { res.status(200).json({ message: 'Welcome to the project-name api' }); });
res.status(500).jsonp(dataRes);