2011-08-31 117 views
1

有没有办法使用平坦的.rb文件来接受POST请求,还是我需要使用像Rails或Sinatra这样的框架来接受请求?Ruby是否需要接受POST请求的框架?

我在思考如何使用flat .php文件来接受POST请求,并使用$_REQUEST[]变量来访问传递的数据。

更具体地说,我试图从PHP中移植一个Twilio应用程序来学习一点Ruby。该应用程序接受短信,处理发送的消息,并根据收到的消息正文发送回复。

在使用PHP时,我可以将Twilio站点中的SMS请求URL设置为我的PHP文件。 PHP文件使用$_REQUEST[]数组来使用收到的消息。 (这似乎是红宝石相当于这是params[]。)

这里就是我谈论的PHP version的一个简单的例子:

<?php 
require "twilio.php";   // Twilio Library 
$ApiVersion  = "2010-04-01"; // Twilio API Version 
$AccountSid  = "SID";  // Twilio SID 
$AuthToken  = "TOKEN";  // Twilio Token 

// Instantiate a new Twilio Rest Client 
$client = new TwilioRestClient($AccountSid, $AuthToken); 

// Get message body & who it's from, for the SMS that was just received 
$SMSbody = mysql_real_escape_string($_REQUEST['Body']); 

if ($SMScode == "codeword"){ 
     $SMSresponse = "You know the code."; 
} 
else{ 
     $SMSresponse = "You do not know the code."; 
} 

// Twilio response to the sender 
header("content-type: text/xml"); 
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"; 
?> 
<Response> 
    <Sms><?php echo $SMSresponse;?></Sms> 
</Response> 

这是我尝试在Ruby equivalent,这可能是进攻坏:

require "rubygems" 
require "twilio-ruby" 

@account_sid = "SID" 
@auth_token = "TOKEN" 
smsbody = params['body'] 

@client = Twilio::REST::Client.new(@account_sid, @auth_token) 
@account = @client.accounts.get(@account_sid) 

if smsbody == "codeword" 
    smsreply = "You know the code" 
else 
    smsreply = "You do not know the code" 

response = Twilio::TwiML::Response.new do |r| 
    r.Sms smsreply 
end 

# print the result 
puts response.text 

这导致了Twilio调试仪表盘,说明得到的答复是超过160个字符。这是因为回复是完整的Ruby代码,而不是由于代码为而运行。这使我认为POST请求没有被正确接受......

回答

1

基于现有的答案以及我所做的所有其他研究,似乎并没有单一的答案来解答这个问题。这是另一种TIMTOWTDI情况。以下是我迄今为止学到的内容的总结,尽管...

将PHP文件放入Apache &的能力可以通过默认启用的mod_php(使其看起来无缝)变得可行。

params[]数组实际上是一个Rails特定的帮助器。为了获得相同的功能,人们必须自己解析请求主体(STDIN)(可能使用由CGI module提供的CGI.parse功能)。

似乎有在我的情况下,几个选项:

对于那些想严格遵守Ruby(不使用PHP passthru函数)的人而言,如果不偏离熟悉的Apache,可能会将Passenger与Camping或Sinatra一起使用。

0

你是如何执行该代码的?据我所知,params散列是Rails特有的,你不能在一个简单的脚本中使用它。

来到你的问题,你不能简单地将红宝石文件放入你的服务器,并期望它会被执行。它将作为文本文件简单地返回给浏览器。

要在web服务器上执行ruby代码,您至少需要rack以及一个能够执行机架应用程序的服务器或处理ruby的apache模块。这不是一个简单的设置,如PHP。

你有两个选择:

  1. 播放,从壳体运行ruby your-script-name红宝石控制台和/或红宝石命令行,即执行它或键入irb开始红宝石控制台。它是最强大的红宝石功能之一,它让我爱上了红宝石。
  2. 如果你真的想在web服务器上下文中执行你的脚本,并安装了php,你可以使用exec你的ruby脚本从php调用它。

这是如何做到这一点假设你的文件被命名为program.rb,添加shebang行作为第一行,并使用ARGV阵列,而不是params散列的例子:

#!/usr/bin/env ruby 
^^^^ Add this line as first line of your script ^^^^ 
require "rubygems" 
require "twilio-ruby" 
... 
smsbody = ARGV[0] # ARGV[0] is the first command line parameter 

使其可执行与chmod +x program.rb,然后从你的PHP脚本

passthru("/path/to/your/ruby/program.rb ". escapeshellarg($_REQUEST['Body'])); 

调用它以这种方式从passthru输出(输出你的ruby程序)将被发送到浏览器。

+1

如果魔术引号被禁用,您的代码包含一个非常好的命令注入漏洞。海报可能首先要清理输入(通过将'''转义为'\'') –

+0

你是绝对正确的,而且它是最危险的......我会更新答案。然而,这只是一个概念证明,希望OP不会在生产中使用这些代码。 – Fabio

+0

他似乎想发送短信,我只能在商业环境中想象。感谢您的更新,只是为了确保:) –

2

你不需要使用框架,并根据你的描述Rails肯定会为你矫枉过正。但是,使用轻量级框架可以使某些方面更好一些。如果你还没有,我建议你看看Camping - 它是为单个文件应用程序设计的。