Ruby是否需要接受POST请求的框架?
有没有办法使用平坦的.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请求没有被正确接受......
基于现有的答案以及我所做的所有其他研究,似乎并没有单一的答案来解答这个问题。这是另一种TIMTOWTDI情况。以下是我迄今为止学到的内容的总结,尽管...
将PHP文件放入Apache &的能力可以通过默认启用的mod_php(使其看起来无缝)变得可行。
params[]
数组实际上是一个Rails特定的帮助器。为了获得相同的功能,人们必须自己解析请求主体(STDIN
)(可能使用由CGI module提供的CGI.parse
功能)。
似乎有在我的情况下,几个选项:
- 使用Passenger让Apache的运行基于机架的Ruby应用程序(如Camping, Sinatra,或Rack)
- 使用纯Ruby Web服务器一样通过PHP的
passthru
功能Unicorn或Thin - 调用Ruby脚本
对于那些想严格遵守Ruby(不使用PHP passthru
函数)的人而言,如果不偏离熟悉的Apache,可能会将Passenger与Camping或Sinatra一起使用。
你是如何执行该代码的?据我所知,params
散列是Rails特有的,你不能在一个简单的脚本中使用它。
来到你的问题,你不能简单地将红宝石文件放入你的服务器,并期望它会被执行。它将作为文本文件简单地返回给浏览器。
要在web服务器上执行ruby代码,您至少需要rack以及一个能够执行机架应用程序的服务器或处理ruby的apache模块。这不是一个简单的设置,如PHP。
你有两个选择:
- 播放,从壳体运行
ruby your-script-name
红宝石控制台和/或红宝石命令行,即执行它或键入irb
开始红宝石控制台。它是最强大的红宝石功能之一,它让我爱上了红宝石。 - 如果你真的想在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程序)将被发送到浏览器。
如果魔术引号被禁用,您的代码包含一个非常好的命令注入漏洞。海报可能首先要清理输入(通过将'''转义为'\'') –
你是绝对正确的,而且它是最危险的......我会更新答案。然而,这只是一个概念证明,希望OP不会在生产中使用这些代码。 – Fabio
他似乎想发送短信,我只能在商业环境中想象。感谢您的更新,只是为了确保:) –