2011-08-31 58 views
1

有沒有辦法使用平坦的.rb文件來接受POST請求,還是我需要使用像Rails或Sinatra這樣的框架來接受請求?Ruby是否需要接受POST請求的框架?

我在思考如何使用flat .php文件來接受POST請求,並使用$_REQUEST[]變量來訪問傳遞的數據。

更具體地說,我試圖從PHP中移植一個Twilio應用程序來學習一點Ruby。該應用程序接受短信,處理髮送的消息,並根據收到的消息正文發送回覆。

在使用PHP時,我可以將Twilio站點中的SMS請求URL設置爲我的PHP文件。 PHP文件使用$_REQUEST[]數組來使用收到的消息。 (這似乎是紅寶石相當於這是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代碼,而不是由於代碼爲而運行。這使我認爲POST請求沒有被正確接受......

回答

1

基於現有的答案以及我所做的所有其他研究,似乎並沒有單一的答案來解答這個問題。這是另一種TIMTOWTDI情況。以下是我迄今爲止學到的內容的總結,儘管...

將PHP文件放入Apache &的能力可以通過默認啓用的mod_php(使其看起來無縫)變得可行。

params[]數組實際上是一個Rails特定的幫助器。爲了獲得相同的功能,人們必須自己解析請求主體(STDIN)(可能使用由CGI module提供的CGI.parse功能)。

似乎有在我的情況下,幾個選項:

對於那些想嚴格遵守Ruby(不使用PHP passthru函數)的人而言,如果不偏離熟悉的Apache,可能會將Passenger與Camping或Sinatra一起使用。

0

你是如何執行該代碼的?據我所知,params散列是Rails特有的,你不能在一個簡單的腳本中使用它。

來到你的問題,你不能簡單地將紅寶石文件放入你的服務器,並期望它會被執行。它將作爲文本文件簡單地返回給瀏覽器。

要在web服務器上執行ruby代碼,您至少需要rack以及一個能夠執行機架應用程序的服務器或處理ruby的apache模塊。這不是一個簡單的設置,如PHP。

你有兩個選擇:

  1. 播放,從殼體運行ruby your-script-name紅寶石控制檯和/或紅寶石命令行,即執行它或鍵入irb開始紅寶石控制檯。它是最強大的紅寶石功能之一,它讓我愛上了紅寶石。
  2. 如果你真的想在web服務器上下文中執行你的腳本,並安裝了php,你可以使用exec你的ruby腳本從php調用它。

這是如何做到這一點假設你的文件被命名爲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程序)將被髮送到瀏覽器。

+1

如果魔術引號被禁用,您的代碼包含一個非常好的命令注入漏洞。海報可能首先要清理輸入(通過將'''轉義爲'\'') –

+0

你是絕對正確的,而且它是最危險的......我會更新答案。然而,這只是一個概念證明,希望OP不會在生產中使用這些代碼。 – Fabio

+0

他似乎想發送短信,我只能在商業環境中想象。感謝您的更新,只是爲了確保:) –

2

你不需要使用框架,並根據你的描述Rails肯定會爲你矯枉過正。但是,使用輕量級框架可以使某些方面更好一些。如果你還沒有,我建議你看看Camping - 它是爲單個文件應用程序設計的。