Требуется ли инфраструктура для Ruby для приема запросов POST? - PullRequest
1 голос
/ 01 сентября 2011

Есть ли способ использовать плоский файл .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>

Вот моя попытка Рубинового эквивалента , что, вероятно, оскорбительно плохо:

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, а не результат того, что run код Ruby. Это заставляет меня думать, что запрос POST не принимается правильно ...

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

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

1 голос
/ 02 сентября 2011

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

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

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

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

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

0 голосов
/ 01 сентября 2011

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

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

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

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

  1. Играть с консолью ruby ​​и / или командной строкой ruby, то есть из оболочки запустить ruby your-script-name ввыполните его или введите irb, чтобы запустить консоль ruby.Это одна из самых мощных функций ruby, которая заставляет меня любить ruby.
  2. Если вы действительно хотите выполнить свой скрипт в контексте веб-сервера и у вас установлен php, вы можете exec свой скрипт rubyВызов его с php.

Это пример того, как сделать так, чтобы ваш файл назывался program.rb, добавить строку shebang в качестве первой строки и использовать массив ARGV вместо params hash:

#!/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) будет отправлен в браузер.

...