Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 内部RESTAPI_Ruby On Rails 3_Api_Internal_Activeresource - Fatal编程技术网

Ruby on rails 3 内部RESTAPI

Ruby on rails 3 内部RESTAPI,ruby-on-rails-3,api,internal,activeresource,Ruby On Rails 3,Api,Internal,Activeresource,目前,我们的网络中有三个站点。一个是用RubyonRails编写的,另外两个是用PHP编写的。所有网站都倾向于共享大量相同的数据和逻辑。我发现自己不得不在PHP端重复我在rails端所做的大量工作。似乎我们需要一个通用的内部API来整合这一点。我以前从未构建过API,我有几个问题 性能如果我将API构建为一个单独的应用程序,它的速度似乎要慢一倍。因为它必须在API端完成整个请求/响应周期,然后再在公共应用程序端完成。有没有办法让这更快?或者是另一种方法 通过本地网络访问API如何通过本地网络访

目前,我们的网络中有三个站点。一个是用RubyonRails编写的,另外两个是用PHP编写的。所有网站都倾向于共享大量相同的数据和逻辑。我发现自己不得不在PHP端重复我在rails端所做的大量工作。似乎我们需要一个通用的内部API来整合这一点。我以前从未构建过API,我有几个问题

  • 性能如果我将API构建为一个单独的应用程序,它的速度似乎要慢一倍。因为它必须在API端完成整个请求/响应周期,然后再在公共应用程序端完成。有没有办法让这更快?或者是另一种方法

  • 通过本地网络访问API如何通过本地网络访问API?我会在Apache中设置指向127.0.0.1的virtualhost吗

  • Active Resource在我的例子中(在rails端),ActiveResource是最好的方式还是有更好的选择来使用API?我还想知道验证将如何在公共端工作。ActiveResource是否重用验证规则,或者我必须在公共端重新创建它们

  • API安全性我想我现在不必太担心这个问题,因为API只能通过本地网络访问(理想情况下)。我的假设正确吗

有很多人已经解决了这个特定的话题。在创建服务时处理管理延迟、稳定性、灵活性和所有其他功能

从一个非常普遍的角度来看,以及您听起来相对简单的用例,我建议在每个应用程序中使用简单的、基于REST的API。您肯定不想重复已经用Ruby编写的PHP代码,反之亦然。在相互竞争的基于HTTP的查询方法之间,响应时间不会太长(无论如何,在讨论HTTP与CORBA之类的东西时,响应时间不会太长)。编写REST资源是RubyonRails擅长的,所以您可以将其作为一个工具。PHP有点难,您只需要以符合REST标准的方式构造可查询API。在这之后,您只需要一个HTTP客户机对任一客户机执行请求。如果您为每个应用程序定义了良好的端点,那么硬编码它们应该不会有太大问题。如果不是的话,还有另一个完整的设计模式可以帮助一个服务找到另一个服务,但通常不具备跨平台的功能(至少,不是我所知道的从Rails到PHP)

对于Ruby/Rails世界,我可以推荐HttpParty或Typheous作为HTTP客户机(它将查询其他应用程序的REST客户机)。对于PHP世界,您可能想看看。它列出了几个例子

很明显,这不是你唯一的选择——你可以创建完全基于web的服务,甚至可以通过创建直接套接字连接等更深入。这实际上完全取决于你希望系统的紧密耦合程度,它们的紧密耦合程度,以及它们的紧密程度(从“网络拓扑”的角度),以及每个系统的响应速度

关于安全性:一种选择是在每个系统上设置防火墙,只接受来自特定IP的特定资源的连接。您可以在应用程序级别遵循类似的模式。尽管您可能同样幸运地使用basic/digest auth保护标准HTTPS会话


希望这有帮助。我可以继续讨论更长的时间,但我不知道有什么好方法可以给这个一般性的问题一个具体的答案。如果有什么我可以详述的,请随意评论,我会尽我所能。

这是一个很好的答案。你能谈谈我应该如何为此设置DNS/Apache吗?只需为api.mycompany.com创建一个a记录为127.0.0.1的DNS条目就足够了吗?或者,如果它指向服务器IP,并且防火墙中有一条规则仅限制对该IP的访问,这会影响性能吗?或者知道IP是本地的,并且与127.0.0.1相同,这是否足够聪明呢?这实际上取决于您的网络拓扑。如果两个应用程序都位于同一个系统上,则可以很容易地将它们直接指向对方。如果您在Apache中使用某种形式的虚拟主机,这可能并不完全正确。如果是这种情况,您可能需要在本地系统上设置一个主机记录以将其指向自身(即:在/etc/hosts中,您将把api.mycompany.com指向127.0.0.1)。至于防火墙问题,您可能需要与您的linux发行版进行核对。例如,如果你在Ubuntu上,你将使用UFW。如果您使用的是CentOS/RedHat等,您可能最终不得不直接使用iptables。就我个人而言,我认为iptables在这种情况下更容易处理。因为大部分情况下,您都会阻止您创建的API的所有传入流量。