有没有办法使用平面.rb文件接受POST请求,还是需要使用像Rails或Sinatra这样的框架来接受请求?
我正在考虑如何使用平面.php文件接受POST请求,并使用$_REQUEST[]
变量来访问传递的数据。
更具体地说,我试图通过从PHP移植我的一个Twilio应用程序来学习一些Ruby。该应用程序接受SMS,处理发送的消息,并根据收到的消息正文发送回复。
使用PHP时,我可以将Twilio站点中的SMS请求URL设置为我的PHP文件。 PHP文件使用$_REQUEST[]
数组来使用收到的消息。 (看起来Ruby的等价物是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代码,而不是运行 Ruby代码的结果。这让我觉得POST请求没有被正确接受......
答案 0 :(得分:2)
您不需要使用框架,并且根据您的描述,Rails肯定会对您有所帮助。但是,使用轻量级框架可以使某些方面更好一些。如果您还没有,我建议您查看Camping - 它适用于单个文件应用。
答案 1 :(得分:1)
根据现有的答案以及我所做的所有其他研究,似乎没有一个答案可以解决这个问题。这是TIMTOWTDI情况中的另一个。以下是我到目前为止所学到的内容的摘要,但是......
将PHP文件放入Apache&amp; amp;通过mod_php使其正常工作,默认情况下启用它(使其看起来无缝)。
params[]
数组实际上是一个特定于Rails的帮助器。要获得相同的功能,必须自己解析请求正文(STDIN
)(可能使用CGI module提供的CGI.parse
函数。)
在我的案例中似乎有几个选项:
passthru
函数对于那些想要严格遵守Ruby(不使用PHP passthru
函数)而不偏离Apache熟悉程度的人来说,前进的方法可能是将Passenger与Camping或Sinatra一起使用。< / p>
答案 2 :(得分:0)
你如何执行该代码?据我所知,params
哈希特定于Rails,你不能在这样的简单脚本中使用它。
提出你的问题,你不能简单地在服务器中删除一个ruby文件,并期望它会被执行。它将作为文本文件简单地返回给浏览器。
要在网络服务器中执行ruby代码,您至少需要rack和能够执行机架应用程序的服务器或处理ruby的apache模块。这不像php那样简单。
你有两个选择:
ruby your-script-name
执行它或键入irb
以启动ruby控制台。它是最强大的红宝石功能之一,让我爱上红宝石的东西之一。exec
你的ruby脚本从php调用它。这是一个关于如何做到这一点的示例,假设您的文件名为program.rb
,将shebang行添加为第一行并使用ARGV
数组而不是params
哈希:< / p>
#!/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
使其可执行,然后使用
passthru("/path/to/your/ruby/program.rb ". escapeshellarg($_REQUEST['Body']));
以这种方式,passthru(ruby程序的输出)的输出将被发送到浏览器。