JSON API 设计 - 快递

Posted

技术标签:

【中文标题】JSON API 设计 - 快递【英文标题】:JSON API design - express 【发布时间】:2016-06-11 20:55:27 【问题描述】:

我想写一个 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);
   
;

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

【问题讨论】:

【参考方案1】:

我建议处理两个端点。一种用于获取 ALL 用户,另一种用于通过 ID 获取 SPECIFC 用户。

    example.com/users example.com/users/:id

第二个端点可用于通过 id 查找特定用户。

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

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

通过这样做,您可以非常轻松地根据 URL 中的参数在 Node 服务中创建查询。

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。

【讨论】:

REST 没有说明端点设计。其余部分为 +1,这是正确的。 我看到的唯一问题是外部的任何人都可以查询数据库并了解内部结构。这是一个潜在的安全问题。 您是否在响应中将用户对象返回给客户端以显示信息?如果是,那么是否有人可以使用 URL 中的字段查询数据库并不重要,因为无论如何他们都可以看到用户结构。此外,您可以在后端进行一些检查,以便在必要时允许查询某些字段。

以上是关于JSON API 设计 - 快递的主要内容,如果未能解决你的问题,请参考以下文章

API开发实践 结构设计

各种快递查询Api接口(快递鸟)

顺丰快递单号查询api对接(全代码)

快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现

快递驿站取件管理系统|基于SpringBoot的快递栈系统设计与实现

android应用开发 快递单号查询介面使用啥api