如何使用Meteor公开RESTful Web服务

时间:2012-04-14 02:31:45

标签: rest meteor

您将如何使用Meteor创建一个安静的Web服务。我想在Appcelerator中创建挂钩到同一后端的应用程序。

Meteor可以解决这个问题吗?

9 个答案:

答案 0 :(得分:33)

我在Meteorpedia上对此进行了全面的写作:

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

该帖子回顾了创建REST界面的所有6个选项,从最高级别(例如,为您处理一切的智能包)到最低级别(例如编写您自己的connectHandler)。

此外,使用REST界面时的帖子涵盖了Meteor中的正确或错误的事情,引用了Meteor REST测试工具,并解释了常见的陷阱,如CORS安全问题。

答案 1 :(得分:22)

我最初回答了这个问题here,但回顾一下:

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

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

对于访问数据库的身份验证,请看一下这个项目:

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

两者在开发过程中肯定都是婴儿,但您可以创建RESTful API并将其与移动本机客户端轻松集成。

答案 2 :(得分:17)

我知道这是一个旧线程,但万一有人偶然发现它,我发布了一个用于在Meteor 0.9.0 +中编写REST API的包:

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

它受到RestStop2的启发,并使用Iron Router的服务器端路由构建。在我不那么谦虚的意见中,它比迄今为止发布的任何内容都更好。

更新:澄清为什么认为它是一个更好的"解决方案比我们提到的解决方案,我只是指出每个方面的差异:

<强> CollectionAPI:
CollectionAPI仅限于在集合上公开非常基本的CRUD操作。对于我在移动应用程序中使用REST API的使用,发送整个文档可能非常浪费,而且大多数时候我需要对数据进行一些额外的处理(例如,发送一个Google Cloud Message)用于添加好友的REST端点,但仅限于成功添加好友的情况)。 CollectionAPI为您提供了一个在执行端点之前运行的钩子,但据我所知,在响应之前没有任何内容,因此您无法修改返回的数据。对于身份验证,CollectionAPI允许您定义必须随每个请求传递的authToken。这更像传统的api密钥,因为它似乎是硬编码到您的应用程序中,因此对每个用户都是相同的。

Restivus,因为它不仅限于集合的自动化工作,它使您可以完全控制您的端点。它现在提供了Collection API中包含的所有功能。它还支持用户身份验证和角色权限,因此您可以识别发出请求的用户(并从经过身份验证的端点轻松访问该用户)。它还提供登录和注销端点以帮助完成此操作。我将在最后为Restivus提供一个代码示例。

<强> HTTP.publish:
据我所知,这类似于CollectionAPI,因为它仅限于在集合上公开基本的CRUD操作。这个更具体地与Meteor的发布相关联,并允许您使用发布功能来处理GET请求。我对文档感到困惑,但它可能有也可能没有一些基本的身份验证。我以前没用过这个,但我不是它的API的忠实粉丝,感觉有点笨重。一旦我更广泛地发布,我将尝试重新审视它。同一个团队有另一个名为HTTP.methods的软件包,它不能让你访问发布函数,但是它具有与Restivus类似的api,并且在当时具有类似的功能。

Restivus更好&#34;因为它并不限制您使用发布功能,因此可以对端点进行更精细的控制。如果您只是想将发布函数公开给外部API,我建议您坚持使用HTTP.publish。 Restivus还有一个更简单的API,并支持HTTP PATCH方法(没有其他包似乎承认存在)。他们的HTTP.methods包非常类似于Restivus,除了它缺乏PATCH支持,虽然它提供了一些基本身份验证,但我相信你只能让所有端点都经过身份验证,或者没有。 Restivus允许您在每个端点(而不仅仅是每个路由)级别上控制它。 Restivus上也提供了端点上的角色权限(例如,用户,管理员),但我没有看到有关HTTP.methods的任何信息。

流星路由器:
这已被弃用,有利于Iron Router,请参阅下文。

铁路由器:
Iron Router非常棒,但它不是专为构建REST API而设计的。最近他们添加了与HTTP方法相对应的功能(GET,POST等),但是他们不支持任何形式的身份验证,并且您可以访问的是较低级别的Node请求和响应对象,因此您和#39;将被迫学习如何与这些人合作。完成后,您会发现每个端点都有一些重复的工作要做,比如使用正确的标头和响应代码创建响应。如果您的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"}
          };
        }
      }
    });
  });
}

答案 3 :(得分:12)

现在有人绊倒了这个(2013+),请查看Meteor Router智能包,它提供了server side routing创建RESTful接口的方法。

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

为了帮助您将来进行搜索,请务必查看https://atmosphere.meteor.com - 智能包存储库。 Meteorite是一个非常方便的CLI工具,用于版本和包管理。

答案 4 :(得分:4)

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

示例:

  

如果递交了集合和发布函数,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({});
});

not yet handle authentication completely

答案 5 :(得分:2)

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

答案 6 :(得分:2)

是的,您可以使用私有API向Meteor公开REST端点。该功能很快就会公开,但与此同时,请参阅Can I mount another route handler through ____meteor_bootstrap____.app?

答案 7 :(得分:2)

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

希望它有所帮助!

答案 8 :(得分:1)

我以为我会更新2014年的对话。我还没有找到在Meteor中实现REST服务的完美方式,我希望有人能指出我的另一个方向进行调查。我测试了3个项目,每个项目都有它们的缺点:

<强> meteor-router 我使用meteor-router,但是github页面说它只会修复bug并在所有新项目中使用Iron Router。我仍然在考虑使用它,因为如果它对我有效,那么除了某种类型的身份验证之外,不需要升级。

<强> iron-router 我有一个使用Iron Router构建的简单示例服务,但它似乎支持REST服务甚至比meteor-router更少,并且如果有人将无效的json发布到休息端点,则会导致服务器崩溃。

<强> meteor-collectionapi 暴露REST API用于基本CRUD操作是支持,但它似乎不支持除id之外的查询。