Требуется ли фреймворк для того, чтобы Ruby принимал POST-запросы?

Есть ли способ использовать плоский файл .rb для приема запросов POST, или мне нужно использовать фреймворк, такой как Rails или Sinatra, для принятия запроса?

Я думаю о том, как я могу использовать плоский файл .php для приема запросов POST и использовать переменную $_REQUEST[] для доступа к переданным данным.

Более конкретно, я пытаюсь немного изучить Ruby, перенеся одно из моих приложений Twilio с PHP. Приложение принимает SMS, обрабатывает отправленное сообщение и отправляет ответ на основе тела полученного сообщения.

При использовании PHP я могу установить URL-адрес запроса SMS на сайте Twilio для моего файла 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 не принимается правильно...


person James Chevalier    schedule 31.08.2011    source источник


Ответы (3)


Вам не нужно использовать фреймворк, и, судя по вашему описанию, Rails определенно будет для вас излишним. Однако использование легковесного фреймворка может сделать некоторые аспекты немного лучше. Я бы порекомендовал взглянуть на Camping, если вы еще этого не сделали — он предназначен для однофайловых приложений.

person Jeremy Weathers    schedule 01.09.2011

Основываясь на существующих ответах и ​​всех других исследованиях, которые я провел, не похоже, что на этот вопрос есть один единственный ответ. Это еще одна из тех ситуаций TIMTOWTDI. Вот краткое изложение того, что я узнал до сих пор, хотя…

Возможность загружать файлы PHP в Apache и обеспечивать его правильную работу стала возможной с помощью mod_php, который включен по умолчанию (что делает его плавным).

Массив params[] на самом деле является специфичным для Rails помощником. Чтобы получить ту же функциональность, нужно самостоятельно разобрать тело запроса (STDIN) (возможно, с помощью функции CGI.parse, предоставляемой модуль CGI).

В моем случае есть несколько вариантов:

Путь вперед для тех, кто хочет строго придерживаться Ruby (не используя функцию PHP passthru), не отклоняясь слишком далеко от знакомства с Apache, может заключаться в использовании Passenger с кемпингом или Sinatra.

person James Chevalier    schedule 02.09.2011

Как вы выполняете этот код? Насколько я знаю, хэш params специфичен для Rails, вы не можете использовать его в таком простом скрипте.

Что касается вашего вопроса, вы не можете просто поместить рубиновый файл на свой сервер и ожидать, что он будет выполнен. Он будет просто возвращен в виде текстового файла в браузер.

Для выполнения кода ruby ​​на веб-сервере вам потребуется как минимум стойка и сервер, способный выполнять приложения стойки или модуль Apache. которые обрабатывают рубин. Это не простая настройка, как php.

Здесь у вас есть два варианта:

  1. Играйте с консолью ruby ​​и/или командной строкой ruby, то есть из оболочки запустите ruby your-script-name, чтобы выполнить ее, или введите irb, чтобы запустить консоль ruby. Это одна из самых мощных функций руби, одна из тех вещей, за которые я люблю рубин.
  2. Если вы действительно хотите выполнить свой скрипт в контексте веб-сервера, и у вас установлен 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) будет отправлено в браузер.

person Fabio    schedule 31.08.2011
comment
Ваш код содержит очень хорошую уязвимость внедрения команд, если магические кавычки отключены. Плакат может сначала очистить ввод (путем экранирования ' в \') - person Niklas B.; 01.09.2011
comment
Вы абсолютно правы, и это один из самых опасных... Я обновлю ответ. Однако это всего лишь доказательство концепции, надеюсь, что OP не будет использовать этот код в производстве. - person Fabio; 01.09.2011
comment
Похоже, он хочет отправить СМС, что я могу представить только в коммерческом контексте. Спасибо за обновление, просто чтобы быть уверенным :) - person Niklas B.; 01.09.2011