1

有没有办法使用平面 .rb 文件来接受 POST 请求,或者我是否需要使用 Rails 或 Sinatra 等框架来接受请求?

我正在考虑如何使用平面 .php 文件来接受 POST 请求,并使用$_REQUEST[]变量来访问传递的数据。

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

在使用 PHP 时,我可以将 Twilio 站点中的 SMS 请求 URL 设置为我的 PHP 文件。PHP 文件使用$_REQUEST[]数组来使用接收到的消息。(似乎与此等效的 Ruby 是params[].)

这是我正在谈论的PHP 版本的快速示例:

<?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 等效项的尝试,这可能非常糟糕

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 请求没有被正确接受......

4

3 回答 3

2

您不需要使用框架,根据您的描述,Rails 对您来说肯定是矫枉过正。但是,使用轻量级框架可以使某些方面更好一些。如果您还没有的话,我建议您看看Camping - 它适用于单文件应用程序。

于 2011-09-01T01:04:51.397 回答
1

根据现有答案以及我所做的所有其他研究,似乎对这个问题没有一个单一的答案。这是 TIMTOWDI 情况中的另一种情况。不过,这里是我到目前为止所学知识的摘要……</p>

将 PHP 文件放入 Apache 并使其正常工作的能力是通过 mod_php 实现的,它默认启用(使其看起来无缝)。

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

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

对于想要坚持严格 Ruby(不使用 PHPpassthru函数)而又不偏离熟悉 Apache 太远的人来说,前进的道路可能是将Passenger 与 Camping 或 Sinatra 一起使用。

于 2011-09-02T01:50:01.817 回答
0

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

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

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

您在这里有两个选择:

  1. 使用 ruby​​ 控制台和/或 ruby​​ 命令行,即从 shell 运行ruby your-script-name以执行它或键入irb以启动 ruby​​ 控制台。这是 ruby​​ 最强大的功能之一,也是让我爱上 ruby​​ 的原因之一。
  2. 如果你真的想在网络服务器上下文中执行你的脚本并且你已经安装了 php,你可以exec让你的 ruby​​ 脚本从 php.ini 调用它。

这是一个关于如何做到这一点的示例,假设您的文件名为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​​ 程序的输出)将被发送到浏览器。

于 2011-08-31T21:37:17.690 回答