Ruby on rails Ruby是否需要一个框架来接受POST请求?

Ruby on rails Ruby是否需要一个框架来接受POST请求?,ruby-on-rails,ruby,post,sinatra,twilio,Ruby On Rails,Ruby,Post,Sinatra,Twilio,有没有办法使用flat.rb文件来接受POST请求,或者我需要使用Rails或Sinatra之类的框架来接受请求 我在考虑如何使用flat.php文件来接受POST请求,并使用$\u REQUEST[]变量来访问传递的数据 更具体地说,我正试图通过从PHP移植我的一个Twilio应用程序来学习一点Ruby。该应用程序接受短信,处理发送的消息,并根据收到的消息正文发送回复 在使用PHP时,我可以将Twilio站点中的SMS请求URL设置为我的PHP文件。PHP文件使用$\u REQUEST[]数组

有没有办法使用flat.rb文件来接受POST请求,或者我需要使用Rails或Sinatra之类的框架来接受请求

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

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

在使用PHP时,我可以将Twilio站点中的SMS请求URL设置为我的PHP文件。PHP文件使用
$\u REQUEST[]
数组来使用收到的消息。(与此类似的Ruby是
params[]

下面是我所说内容的一个快速示例:

<?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>

这导致Twilio调试仪表板显示回复超过160个字符。这是因为回复是完整的Ruby代码,而不是运行Ruby代码的结果。这让我觉得POST请求没有被正确接受…

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

说到你的问题,你不能简单地把一个ruby文件放到你的服务器中,然后期望它会被执行。它将简单地作为文本文件返回到浏览器

要在Web服务器中执行ruby代码,您至少需要一台能够执行rack应用程序的服务器或处理ruby的apache模块。这不是像php那样简单的设置

您有两种选择:

  • 使用ruby控制台和/或ruby命令行,即从shell运行
    ruby脚本名执行它,或键入
    irb
    启动ruby控制台。这是ruby最强大的特性之一,也是让我爱上ruby的原因之一
  • 如果您确实希望在Web服务器上下文中执行脚本,并且已经安装了php,那么可以从php调用ruby脚本
  • 这是一个关于如何执行此操作的示例,假设文件名为
    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使其可执行,然后使用

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

    这样,来自(ruby程序的输出)的输出将被发送到浏览器。

    您不需要使用框架,并且根据您的描述,Rails对您来说肯定是多余的。然而,使用轻量级框架可以使某些方面变得更好。如果你还没有,我建议你看看——它是针对单文件应用的。

    基于现有的答案和我所做的所有其他研究,这个问题似乎没有一个单一的答案。这是TIMTOWTDI的另一种情况。这是我到目前为止所学知识的总结,不过

    mod_PHP使将PHP文件放入Apache并使其正常工作成为可能,它在默认情况下是启用的(使其看起来无缝)

    该数组实际上是Rails特定的助手。要获得相同的功能,您必须自己解析请求主体(
    STDIN
    )(可能使用由提供的
    CGI.parse
    函数)

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

    • 用于让Apache运行基于框架的Ruby应用程序(如, ,或)
    • 使用纯Ruby web服务器,如或
    • 通过PHP函数调用Ruby脚本

    对于那些希望严格使用Ruby(不使用PHP
    passthru
    函数)而不偏离Apache熟悉程度的人来说,前进的道路可能是将Passenger与Camping或Sinatra一起使用。

    如果禁用了magic quotes,您的代码包含一个非常好的命令注入漏洞。Poster可能希望首先对输入进行清理(通过将
    '
    转义到
    \'
    ),这是绝对正确的,而且是最危险的。。。我会更新答案。不过,这只是一个概念验证,希望OP不会在生产中使用此代码。看起来他想发送短信,这只能在商业环境中想象得到。感谢您的更新,只是为了确保:)
    passthru("/path/to/your/ruby/program.rb ". escapeshellarg($_REQUEST['Body']));