如何使用Meteor公开一个REST风格的Web服务

您将如何使用Meteor创build一个宁静的Web服务。 我想创buildAppcelerator中的应用程序挂钩到相同的后端。

meteor能解决这个问题吗?

我想你可能可以使用Meteor创build一个RESTful服务,但这不是框架的真正意图–Meteor的主要好处之一是客户端与服务器之间的紧密交互,而Web服务没有客户端。 我build议考虑编写一个Web服务后端在node.js自己或类似的东西像https://github.com/intridea/grape如果你喜欢Ruby。;

我在Meteorpedia做了一个完整的写作:

http://www.meteorpedia.com/read/REST_API

这篇文章回顾了创buildREST接口的所有6个选项,从最高级别(例如为您处理所有事情的智能包)到最低级别(例如编写您自己的connectHandler)。

另外,在使用REST接口时,这篇文章介绍了Meteor的正确或错误的事情,引用了Meteor RESTtesting工具,并解释了像CORS安全问题这样的常见错误。

我原本在这里回答这个问题,但回顾一下:

要在您的数据之上添加RESTful方法,请查看为Meteor编写的Collection API:

https://github.com/crazytoad/meteor-collectionapi

至于访问数据库的authentication,看看这个项目:

https://github.com/meteor/meteor/wiki/Getting-started-with-Auth

两者绝对是婴幼儿开发,但您可以创build一个RESTful API,并很容易地将其与移动本地客户端集成。

我知道这是一个古老的线程,但是如果有人发现了这个问题,我发布了一个在Meteor 0.9.0+中编写REST API的包:

https://github.com/kahmali/meteor-restivus

它受到RestStop2的启发, 并由 Iron Router的服务器端路由构build。 在我不那么卑微的意见中,这是比迄今发布的任何内容更好的解决scheme。

更新:为了澄清为什么认为这是一个比所提到的更好的解决scheme,我只是指出每个之间的差异:

CollectionAPI:
CollectionAPI仅限于在您的collections中公开非常基本的CRUD操作。 对于我在使用移动应用程序中使用REST API的应用程序来说,发送整个文档可能是非常浪费的,而且大部分时间我都需要做一些额外的数据处理(例如,发送Google Cloud Message RESTterminal添加一个朋友,但只有在朋友成功添加)。 CollectionAPI为您提供了一个在端点执行之前运行的钩子,但是从我所了解的响应之前没有任何东西,所以您无法修改返回的数据。 为了进行身份validation,CollectionAPI允许您定义一个必须在每个请求中传递的authToken。 这更像是一个传统的api键,因为它似乎是硬编码到你的应用程序,因此每个用户都是一样的。

Restivus,因为它不限于在集合上进行自动化工作,所以可以完全控制您的端点。 它现在提供了Collection API中包含的所有function。 它还支持用户身份validation和angular色权限,因此您可以识别发出请求的用户(并可以从经过身份validation的terminal轻松访问该用户)。 它提供了一个login和注销端点以及协助。 我将在最后为Restivus提供一个代码示例。

HTTP.publish:
据我所知,这与CollectionAPI类似,仅限于公开collections的基本CRUD操作。 这个更具体地与Meteor的发布绑定,并且允许你使用发布function来处理GET请求。 我很困惑的文件,但它可能会或可能不会有一些基本的authentication可用。 我以前没有用过这个,但是我不是那个API的狂热粉丝,感觉有点笨重。 一旦我出版更广泛,我会尝试重新审视它。 同一个团队有另外一个叫做HTTP.methods的包,它不能让你访问发布function,但是有一个类似于Restivus的api,当时还有类似的function。

Restivus是“更好的”,因为它不限制你使用你的发布函数,因此可以对你的端点进行更细致的控制。 如果你只是想发布你的发布function到外部的API,我会build议你坚持HTTP.publish。 Restivus也有一个更简单的API,并支持HTTP PATCH方法(其他包似乎不承认存在)。 他们的HTTP.methods包与Restivus非常相似,只是它缺less对PATCH的支持,虽然它提供了一些基本的authentication,但是我相信你只能使所有的端点都通过authentication,或者没有。 Restivus将允许您在每个端点(而不仅仅是每个路由)级别上控制它。 Restivus上还提供了端点上的angular色权限(例如,用户,pipe理员),但是对于HTTP.methods,我没有看到任何相关信息。

meteor路由器:
这已被弃用,铁路路由器,请参阅下面。

铁路路由器:
Iron Router非常棒,但它并不是专门为构buildREST API而devise的。 最近,他们添加了对应于HTTP方法(GET,POST等)的函数,但是它们不支持任何forms的身份validation,所有您可以访问的都是较低级别的Node请求和响应对象,被迫学习如何与这些工作。 一旦你这样做,你会发现每个端点都有一些重复的工作要做,比如用合适的头文件和响应代码来创build响应。 如果您的API正在从浏览器中消耗,您还必须担心CORS合规性。

Restivus实际上是build立在铁路路由器之上的,并且在端点上提供了一层authentication。 它也抽象出直接与Node请求和响应对象进行交互的需求,尽pipe它们仍然存在以防万一我们错过了任何东西。 所以它使用Iron Router的所有令人敬畏的高级API来满足您的编码乐趣。 如果你已经使用Iron Router,Restivus是非常棒的,因为它不会增加额外的依赖。

RestStop2:
我实际上是在使用RestStop2的时候,我正在使用一个项目,而不赞成使用Iron Router。 他们有坚实的文件,而且我比其他人更喜欢API。 根据他们的build议,我在铁路路由器的基础上build立了一个新的软件包,它受到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智能包,它提供了用于创buildRESTful接口的服务器端路由方法。

 Meteor.Router.add('/404', [404, "There's nothing here!"]); 

为了帮助您日后进行search,请务必查看https://atmosphere.meteor.com – 一个智能包存储库。 陨石是一个非常方便的CLI工具,用于版本和包pipe理。

最优雅的解决scheme似乎是HTTP.publish 。 而不是像其他人一样创造一个新的API,它只是将HTTP协议添加到现有的Meteor publish界面。 这意味着,例如, Meteor.allowMeteor.deny自动为HTTP和DDP工作。

例:

如果交给一个集合和一个发布函数, HTTP.publish将挂载在以下URL和方法上:

GET – / api / list – 所有发布的数据
POST – / api / list – 将文档插入到集合中
GET – / api / list /:id – find一个发布的文档
PUT – / api / list /:id – 更新文档
删除 – / 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({}); }); 

它尚未完全处理authentication 。

是的,您可以使用私有API向Meteor公开REST端点。 该function将很快公开,但同时,请参阅我可以通过____meteor_bootstrap____.app安装另一个路由处理程序吗? 。

我以为我会更新2014年的对话。我还没有find完美的方式来实施meteor的REST服务,我希望有人可以指向另一个方向去调查。 我已经testing了3个项目,每个都有它们的缺点:

meteor路由器我使用meteor路由器,但github页面说,它只会修复错误,并在所有新项目上使用铁路路由器。 我仍然在考虑使用这个,因为如果它适用于我,那么升级是没有必要的,除了某种types的身份validation。

铁路由器我有一个简单的示例服务使用铁路路由器构build,但它似乎支持REST服务甚至比meteor路由器,并导致服务器崩溃,如果有人张贴无效的JSONrest端点。

meteor-collectionapi为基本的CRUD操作公开一个REST api是支持的,但它似乎不支持除id以外的查询。

我知道这是一个老话题,但不使用任何外部软件包,您可以使用Meteor WebApp软件包: https : //docs.meteor.com/packages/webapp.html 。

希望能帮助到你!