Ruby on rails Ruby是否需要一个框架来接受POST请求?
有没有办法使用flat.rb文件来接受POST请求,或者我需要使用Rails或Sinatra之类的框架来接受请求 我在考虑如何使用flat.php文件来接受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[]数组
$\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脚本名执行它,或键入irb
启动ruby控制台。这是ruby最强大的特性之一,也是让我爱上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(不使用PHPpassthru
函数)而不偏离Apache熟悉程度的人来说,前进的道路可能是将Passenger与Camping或Sinatra一起使用。如果禁用了magic quotes,您的代码包含一个非常好的命令注入漏洞。Poster可能希望首先对输入进行清理(通过将'
转义到\'
),这是绝对正确的,而且是最危险的。。。我会更新答案。不过,这只是一个概念验证,希望OP不会在生产中使用此代码。看起来他想发送短信,这只能在商业环境中想象得到。感谢您的更新,只是为了确保:)
passthru("/path/to/your/ruby/program.rb ". escapeshellarg($_REQUEST['Body']));