Javascript RESTAPI的反思

Javascript RESTAPI的反思,javascript,node.js,rest,express,reflection,Javascript,Node.js,Rest,Express,Reflection,我正在尝试构建一个(尽可能接近)通用RESTAPI,以简化所有标准CRUDREST调用。例如,我想写一个read方法 models.{Entity}.findById(id) .exec(function(err, entity) { res(err, entity) } {Entity}应使用rest调用中的参数动态填充,例如: GET /api/v1/entity/:id/:type GET /api/v1/entity/1234567890/user 显然,我可以这样做

我正在尝试构建一个(尽可能接近)通用RESTAPI,以简化所有标准CRUDREST调用。例如,我想写一个
read
方法

models.{Entity}.findById(id)
  .exec(function(err, entity) {
    res(err, entity)
  }
{Entity}
应使用rest调用中的参数动态填充,例如:

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);

当涉及到不同的反射技术、不同的语言、不同的语言实现、底层硬件/操作系统平台时,反射性能无处不在。虽然Java一直是出了名的糟糕,但其他语言的开销可以忽略不计。TLDR:除非你有证据证明这会让你慢下来,否则我不会排除这个可能性

在本例中,作为JavaScript,我认为您可以只做
models[name.toLowerCase()]
,这与
models.User
等操作相同,但属于一般操作


如果反射确实要付出代价,那么您仍然可以根据结果进行一般性处理,即,一般性地计算一次并无限期地缓存结果类。

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

谢谢,有时候答案对我来说太容易了:谢谢你的洞察力,我现在就坚持你的解决方案!谢谢你的回复!目前我将使用mahemoff的解决方案,但我肯定会阅读更多关于rest与http api的内容(目前我不太确定两者的区别),HATEOS.http是一种协议,而rest是一种体系结构风格。如果使用HTTP构建系统,您将免费获得REST定义的许多约束。但是,如果希望API是RESTful的(遵守REST定义的所有约束并从引入系统的属性中获益),还需要做一些额外的工作。RESTAPI是HTTP API的一个特例——很多人会说它是一个正确的HTTP API。我今天读了一些关于这个主题的文章。我想我会尝试实现一个“真正的”restful api,看看它是如何运行的。感谢您的输入:)