0

我们正在开展一个实施 LMS 的 RoR 项目。我们需要将数据发送到外部服务器提供的外部 REST 服务。当某些事件完成时发送数据,其中一些可能不是由客户端触发的(点击等)。

此外,我们需要保持 Rails 模型的一致性,因为我们需要记录用户活动。

提供了一个使用 JavaScript 编写的 API 库。它使大部分工作变得简单,因此我们希望使用而不是为 API 请求创建自己的实现。

以下每种方法之间有什么区别?一个会比另一个更可取吗?

  1. 使用 javascripts 从客户端发送数据,在视图中插入片段,但是让客户端执行这可能会产生一些严重的影响(分数改变,错误成功等)。

  2. 使用 NodeJS 服务器来执行 Javascript,但我们真的不知道如何与我们的主服务器(Rails)通信

  3. 最后,使用 Rails 应用程序中的 HTTP 客户端将请求发送到服务。然而我们并不确切知道如何去做,还有这个代码在 MVC 模式中的位置的问题。

4

1 回答 1

0

正如您可能已经意识到的那样,选项#1 是不可能的。为了让客户端代表您进行 API 调用,您需要向他们发送您的密钥/令牌/您需要使用 API 进行身份验证的任何内容。但是一旦他们有了这个,他们就可以使用脚本控制台来“像你一样”进行他们想要的任何 API 调用。这将是非常灾难性的。

选项#2 可能过于复杂——我个人不确定你会如何去做。可以使用therubyracer 之类的库从 Ruby 代码执行 JavaScript 代码,但存在一定程度的沙盒,这可能会破坏需要网络访问的代码。

剩下的就是选项 #3,编写自己的 Ruby 库来与 API 交互。这可能容易或困难,取决于 API 的复杂程度,但您手头已经有 JavaScript 版本(希望 REST 服务本身的文档),因此结合RestClient或HTTParty之类的东西,前进的道路应该是清晰的。

至于 API 调用在哪里适合您的 Rails 代码:如果您的模型基本上反映了您通过 REST 服务与之交互的资源,则将相关 API 调用作为方法或回调添加到这些模型上可能是有意义的. 否则,将它们放在相关的控制器操作中可能会很好,但请注意您的代码复杂性,如果事情变得丑陋,请提取到单独的类或模块中。

(如果您不需要等待 API 的响应再将内容发送回用户,您可能需要使用DelayedJob或类似方法在后台对 API 调用进行排队。)

于 2013-08-21T19:54:45.110 回答