2016-02-28 53 views
1

我想写一个JSON API。JSON API设计 - 快递

我的问题是,有时我想查询一个ID,有时为一个字符串。

一个办法是增加一个查询字符串,例如:

example.com/user/RandomName 
example.com/user/1234556778898?id=true 

,并用它喜欢:

api.get('user/:input', function(req, res) { 
    if(req.query.id) { 
    User.find({ '_id': req.params.input }, cb); 
    } else { 
    User.find({ 'name': req.params.input }, cb); 
    } 
}; 

但这似乎是不好的做法对我来说,因为它导致了一堆的条件表达式。 有没有更优雅的方式?

回答

2

我会建议处理两个端点。一个用于通过ID得到全部用户和一个用于得到SPECIFC用户。

  1. example.com/users
  2. example.com/users/:id

第二端点可以用来找到ID特定的用户。

第一个端点可用于查找所有用户,但过滤器可应用于此端点。

例如:example.com/users?name=RandomName

通过这样做,你可以非常容易地创建基于在URL中的参数,在您的节点服务的查询。

api.get('/users', function(req, res) { 
    // generate the query object based on URL parameters 
    var queryObject = {}; 
    for (var key in req.query) { 
     queryObject[key] = req.query[key]; 
    } 

    // find the users with the filter applied. 
    User.find(queryObject, cb); 
}; 

通过构建您的端点这种方式,你是以下一个RESTful API标准,这将使它很容易让别人理解你的代码和API。此外,您正在构建一个适应性API,因为您现在可以通过将该字段作为参数添加到URL来按任意字段过滤用户。

有关何时使用路径参数与URL参数的更多信息,请参阅this response

+0

REST对端点设计没有任何说明。其余部分+1,这是现货。 –

+0

我在实现中看到的唯一问题是任何来自外部的人都能够查询数据库并获得内部结构的洞察。这是一个潜在的安全问题。 – Stefan

+0

您是否在显示信息的响应中将用户对象返回给客户端?如果是的话,任何人都可以使用URL中的字段来查询数据库并不重要,因为无论如何他们都能够看到用户结构。此外,您可以在后端进行一些检查,以便现在允许在必要时查询某些字段。 – Mike