您将如何使用 Meteor 创建一个安静的 Web 服务。我想在 Appcelerator 中创建连接到同一后端的应用程序。
Meteor 能解决这个问题吗?
我在 Meteorpedia 中对此进行了完整的撰写:
http://www.meteorpedia.com/read/REST_API
这篇文章回顾了创建 REST 接口的所有 6 个选项,从最高级别(例如为您处理一切的智能包)到最低级别(例如编写您自己的 connectHandler)。
此外,这篇文章还介绍了在 Meteor 中使用 REST 接口是对还是错,参考 Meteor REST 测试工具,并解释了 CORS 安全问题等常见缺陷。
我最初在这里回答了这个问题,但回顾一下:
要在数据之上添加 RESTful 方法,请查看为 Meteor 编写的 Collection API:
https://github.com/crazytoad/meteor-collectionapi
至于访问数据库的认证,看看这个项目:
https://github.com/meteor/meteor/wiki/Getting-started-with-Auth
两者在开发中都绝对是幼稚的,但是您可以创建一个 RESTful API 并将其与移动本地客户端轻松集成。
我知道这是一个旧线程,但如果有人偶然发现它,我发布了一个用于在 Meteor 0.9.0+ 中编写 REST API 的包:
https://github.com/kahmali/meteor-restivus
它受到RestStop2的启发,并使用Iron Router的服务器端路由构建。在我不那么谦虚的意见中,这是一个比迄今为止在这里发布的任何内容更好的解决方案。
更新:为了澄清为什么我认为这是一个比上述解决方案“更好”的解决方案,我将指出每个解决方案之间的区别:
集合API:
CollectionAPI 仅限于在您的集合上公开非常基本的 CRUD 操作。对于我的使用,在移动应用程序中使用 REST API,发送整个文档可能非常浪费,而且大多数时候我需要对数据进行一些额外的处理(例如,在用于添加好友的 REST 端点,但前提是好友已成功添加)。CollectionAPI 为您提供了一个在端点执行之前运行的钩子,但据我了解,在响应之前没有任何内容,因此您无法修改返回的数据。对于身份验证,CollectionAPI 允许您定义必须随每个请求传递的 authToken。这更像是一个传统的 api 密钥,因为它似乎被硬编码到你的应用程序中,
Restivus,因为它不限于对集合的自动化工作,让您可以完全控制您的端点。它现在提供 Collection API 中包含的所有功能。它还支持用户身份验证和角色权限,因此您可以识别发出请求的用户(并轻松地从经过身份验证的端点访问该用户)。它还提供了一个登录和注销端点来帮助实现这一点。我将在最后提供一个 Restivus 的代码示例。
HTTP.publish:据
我了解,这类似于 CollectionAPI,因为它仅限于公开对集合的基本 CRUD 操作。这个更具体地与 Meteor 的发布相关,并允许您使用发布功能来处理 GET 请求。我对文档感到困惑,但它可能有也可能没有一些可用的基本身份验证。我以前没有使用过这个,但我不是它的 API 的忠实粉丝,感觉有点笨拙。一旦我更广泛地出版,我会尝试重新审视它。同一个团队还有另一个名为 HTTP.methods 的包,它不会让您访问发布功能,但具有与 Restivus 类似的 api,并且当时具有类似的功能。
Restivus 是“更好的”,因为它不会限制您使用发布功能,因此可以对您的端点进行更细粒度的控制。如果您只是想将发布函数公开给外部 API,我建议您坚持使用 HTTP.publish。Restivus 也有一个更简单的 API 并支持 HTTP PATCH 方法(似乎没有其他包承认存在)。他们的 HTTP.methods 包与 Restivus 非常相似,只是它缺乏 PATCH 支持,虽然它提供了一些基本的身份验证,但我相信你只能使所有端点都经过身份验证,或者没有。Restivus 将允许您在每个端点(不仅仅是每个路由)级别上控制它。端点上的角色权限(例如,用户、管理员)也可在 Restivus 上使用,但我没有看到任何关于 HTTP 的内容。
Meteor Router:
这已被弃用,取而代之的是 Iron Router,请参见下文。
Iron Router:
Iron Router 很棒,但它并不是专门为构建 REST API 而设计的。最近他们添加了对应于 HTTP 方法(GET、POST 等)的功能,但它们不支持任何形式的身份验证,并且您只能访问较低级别的 Node 请求和响应对象,因此您将被迫学习如何与这些人合作。一旦你这样做了,你会发现在每个端点都有一些重复的工作要做,比如使用正确的标头和响应代码创建响应。如果您的 API 是从浏览器中使用的,您还必须担心 CORS 合规性。
Restivus 实际上建立在 Iron Router 之上,并在端点上提供了一层身份验证。它还抽象出与 Node 请求和响应对象直接交互的需要,尽管它们仍然存在以防我们错过任何东西。因此,它使用 Iron Router 的所有出色功能和更高级别的 API,为您带来编码乐趣。如果您已经在使用 Iron Router,Restivus 非常棒,因为它不会添加任何额外的依赖项。
RestStop2:
我实际上是在我正在处理的一个项目中使用 RestStop2,当时它被弃用以支持 Iron Router。他们有可靠的文档,还有一个我比其他人更喜欢的 API。根据他们的建议,我在 Iron Router 上构建了一个新包,它的灵感来自 RestStop2。Restivus 现在在 RestStop2 GitHub 页面上得到认可,所以我认为他们同意它是一个值得替代的产品。
这是来自 Restivus 文档的快速入门部分的一小段代码:
if(Meteor.isServer) {
Meteor.startup(function () {
// Global configuration
Restivus.configure({
useAuth: true,
prettyJson: true
});
// Generates: GET, POST on /api/users and GET, DELETE /api/users/:id for
// Meteor.users collection
Restivus.addCollection(Meteor.users, {
excludedEndpoints: ['deleteAll', 'put'],
routeOptions: {
authRequired: true
},
endpoints: {
post: {
authRequired: false
},
delete: {
roleRequired: 'admin'
}
}
});
// Maps to: POST /api/articles/:id
Restivus.addRoute('articles/:id', {authRequired: true}, {
post: {
roleRequired: ['author', 'admin'],
action: function () {
var article = Articles.findOne(this.urlParams.id);
if (article) {
return {status: "success", data: article};
}
return {
statusCode: 400,
body: {status: "fail", message: "Unable to add article"}
};
}
}
});
});
}
现在 (2013+) 遇到这个问题的人,请查看Meteor Router智能包,它提供了用于创建 RESTful 接口的服务器端路由的方法。
Meteor.Router.add('/404', [404, "There's nothing here!"]);
为了帮助您将来进行搜索,请务必查看https://atmosphere.meteor.com - 一个智能包存储库。Meteorite是一个非常方便的 CLI 工具,用于版本和包管理。
最优雅的解决方案似乎是HTTP.publish。它没有像其他人一样发明新的 API,而是简单地将 HTTP 协议添加到现有的 Meteorpublish
接口中。例如,这意味着它可以自动为 HTTP 和 DDP 工作Meteor.allow
。Meteor.deny
例子:
如果传递了一个集合和一个发布函数,
HTTP.publish
它将安装在以下 URL 和方法上:GET - /api/list - 所有发布的数据
POST - /api/list - 将文档插入集合
GET - /api/list/:id - 找到一个发布的文档
PUT - /api/list/:id - 更新文档
DELETE - /api/list/:id - 删除一个文档
myCollection = new Meteor.Collection('list');
// Add access points for `GET`, `POST`, `PUT`, `DELETE`
HTTP.publish(myCollection, function(data) {
// this.userId, this.query, this.params
return myCollection.find({});
});
它还没有完全处理身份验证。
我想您可能可以使用 Meteor 创建一个 RESTful 服务,但这并不是该框架的真正用途——Meteor 的主要优点之一是客户端和服务器之间的紧密交互,而 Web 服务没有客户端。如果您喜欢 Ruby,我建议您考虑自己在 node.js 中编写 Web 服务后端,或者像https://github.com/intridea/grape这样的东西。
是的,您可以使用私有 API 通过 Meteor 公开 REST 端点。该功能将很快公开,但与此同时,请参阅Can I mount another route handler through ____meteor_bootstrap____.app? .
我知道这是一个老话题,但您可以使用 Meteor WebApp 包,而不是使用任何外部包: https ://docs.meteor.com/packages/webapp.html 。
希望能帮助到你!
我想我会更新 2014 年的对话。我仍然没有找到在 Meteor 中实现 REST 服务的完美方法,我希望有人能指出我另一个研究方向。我测试了 3 个项目,每个项目都有其缺点:
meteor-router 我使用meteor-router,但是github页面上说它只会修复错误并在所有新项目中使用Iron Router。我仍在考虑使用它,因为如果它按原样对我有用,那么除了某种类型的身份验证外,不需要升级。
Iron-router 我有一个使用 Iron Router 构建的简单示例服务,但它似乎支持 REST 服务,甚至比meteor-router 还要少,如果有人将无效的 json 发布到 REST 端点,它会导致服务器崩溃。
meteor-collectionapi 公开一个 REST api 来支持基本的 CRUD 操作,但它似乎不支持除 id 以外的查询。