我们正在进行一个实现LMS的RoR项目。我们需要将数据发送到由外部服务器提供的外部REST服务。数据是在某些事件完成时发送的,其中一些事件可能不是由客户端触发的(点击等)
此外,我们需要在rails模型中保持一致性,因为我们需要记录用户活动。
提供了一个使用API的库,该库是用JavaScript编写的。它使大部分工作变得容易,因此我们希望使用而不是为API请求创建自己的实现。
以下每种方法之间有什么区别?一个比另一个好吗?
-
使用javascript发送数据,在视图,但让客户端执行可能会一些严重的影响(分数改变、虚假成功等)。
-
使用NodeJS服务器来执行Javascript,但我们真的不知道如何与主服务器(Rails)通信
-
最后,使用Rails应用程序中的HTTP客户端将请求发送到服务。然而,我们不知道如何做到这一点,还有一个问题是这些代码在MVC模式中的位置。
您可能已经意识到,选项#1是不可能的。为了让客户代表您进行API调用,您需要向他们发送您的密钥/令牌/您需要使用API进行身份验证的任何东西。但一旦他们有了这些,他们就可以使用脚本控制台"像你一样"进行他们想要的任何API调用。这将是非常灾难性的。
选项#2可能非常复杂——我个人不确定你会怎么做。使用像therubyracer这样的库,从Ruby代码中执行JavaScript代码是可能的,但存在一定程度的沙盒,这可能会破坏需要网络访问的代码。
这就给您留下了选项#3,编写您自己的Ruby库来与API交互。这可能很容易,也可能很难,这取决于API有多庞大,但您手头已经有了JavaScript版本(希望还有REST服务本身的文档),因此与RestClient或HTTParty之类的东西相结合,前进的道路应该是清晰的。
至于API调用在Rails代码中的位置:如果您的模型基本上是通过REST服务镜像您正在交互的资源,那么添加相关的API调用作为这些模型上的方法或回调可能是有意义的。否则,把它们放在相关的控制器操作中可能没问题,但要注意代码的复杂性,如果情况变得不好,就提取到一个单独的类或模块中。
(如果您不需要等待API的响应,然后再向用户发送内容,您可能需要使用DelayedJob或类似功能在后台对API调用进行排队。)