Ruby是否需要接受POST请求的框架?

时间:2011-08-31 21:11:52

标签: ruby-on-rails ruby post sinatra twilio

有没有办法使用平面.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请求没有被正确接受......

3 个答案:

答案 0 :(得分:2)

您不需要使用框架,并且根据您的描述,Rails肯定会对您有所帮助。但是,使用轻量级框架可以使某些方面更好一些。如果您还没有,我建议您查看Camping - 它适用于单个文件应用。

答案 1 :(得分:1)

根据现有的答案以及我所做的所有其他研究,似乎没有一个答案可以解决这个问题。这是TIMTOWTDI情况中的另一个。以下是我到目前为止所学到的内容的摘要,但是......

将PHP文件放入Apache&amp; amp;通过mod_php使其正常工作,默认情况下启用它(使其看起来无缝)。

params[]数组实际上是一个特定于Rails的帮助器。要获得相同的功能,必须自己解析请求正文(STDIN)(可能使用CGI module提供的CGI.parse函数。)

在我的案例中似乎有几个选项:

对于那些想要严格遵守Ruby(不使用PHP passthru函数)而不偏离Apache熟悉程度的人来说,前进的方法可能是将Passenger与Camping或Sinatra一起使用。< / p>

答案 2 :(得分:0)

你如何执行该代码?据我所知,params哈希特定于Rails,你不能在这样的简单脚本中使用它。

提出你的问题,你不能简单地在服务器中删除一个ruby文件,并期望它会被执行。它将作为文本文件简单地返回给浏览器。

要在网络服务器中执行ruby代码,您至少需要rack和能够执行机架应用程序的服务器或处理ruby的apache模块。这不像php那样简单。

你有两个选择:

  1. 使用ruby控制台和/或ruby命令行,即从shell运行ruby your-script-name执行它或键入irb以启动ruby控制台。它是最强大的红宝石功能之一,让我爱上红宝石的东西之一。
  2. 如果你真的想在网络服务器上下文中执行你的脚本并安装了php,你可以exec你的ruby脚本从php调用它。
  3. 这是一个关于如何做到这一点的示例,假设您的文件名为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使其可执行,然后使用

    从php脚本中调用它
    passthru("/path/to/your/ruby/program.rb ". escapeshellarg($_REQUEST['Body']));
    

    以这种方式,passthru(ruby程序的输出)的输出将被发送到浏览器。