对 REST 的思考 API

Reflections for REST API

我正在尝试构建一个(尽可能接近)通用 REST API 来简化所有标准 CRUD 休息调用。例如我想写一个 read 方法

models.{Entity}.findById(id)
  .exec(function(err, entity) {
    res(err, entity)
  }

{Entity} 应该用来自其余调用的参数动态填充,例如:

GET /api/v1/entity/:id/:type
GET /api/v1/entity/1234567890/user

显然我可以像这样做一个半通用的解决方案:

if (type === 'user') var query = models.User;

但在我看来这并不是一个很好的解决方案。

问题

有没有一种简单的方法来实现它,这在更大的应用程序上是否可行?因为我所知道的关于其他语言反射的一切,它们的性能都不是很好。

关于如何实施这样的框架,还有其他建议吗?

解法:

就像丹尼尔建议的那样,我创建了一个地图

var map = new Map();
map.set('user', models.User);

当涉及到不同的反射技术、不同的语言、不同的语言实现、底层 hardware/OS 平台时,反射性能无处不在。虽然 Java 出了名的差,但其他语言的开销可以忽略不计。 TLDR:我不会排除它,除非你有证据表明它真的会减慢你的速度。

在这种情况下,作为Java脚本,我认为你可以只做models[name.toLowerCase()],它与models.User等相同,但通用。

如果反射确实有成本,您仍然可以通过 memoizing 结果进行一般处理,即一般计算一次并无限期地缓存结果 class。

您正在尝试解决一个可以避免的问题。如果您的服务器将提供 REST API 而不是 HTTP API(知道区别!),您将不需要构建 URL,因为服务器会通过超媒体控件告诉您下一步可以做什么响应。如果您有兴趣,请阅读 HATEOAS 和超媒体。 由于超媒体都是关于响应的 MIME 类型的,因此通用客户端通常围绕单个 MIME 类型构建。 (仅举几例:HAL、UBER、Siren、Collection+JSON)。