对 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)。
我正在尝试构建一个(尽可能接近)通用 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)。