ruby - 如何在 Rails 中发出异步 http 请求

标签 ruby http ruby-on-rails-4 asynchronous

在我的 Rails 应用程序中,我需要向 3rd 方服务发出 http 请求,因为 http 请求是同步的,有时需要超过 20 秒才能从他们那里得到响应。

我只是向该服务推送一些数据,我不关心响应是什么,所以我想让请求异步,这样我的代码将继续执行而不会被阻塞。

我怎么能用 ruby​​ 做到这一点?

最佳答案

I need to make a http request...so my code will continue execution and not been blocked.

def some_action
  Thread.new do
    uri = URI('http://localhost:4567/do_stuff')
    Net::HTTP.post_form(uri, 'x' => '1', 'y' => '2')
  end

  puts "****Execution continues here--before the response is received."
end

这是一个可以用来测试它的 sinatra 应用程序:

1) $ gem install sinatra

2)

#my_sinatra_app.rb

require 'sinatra'

post '/do_stuff' do
  puts "received: #{params}" #Check the sinatra server window for the output.
  sleep 20  #Do some time consuming task.

  puts "Sending response..."
  "The result was: 30"   #The response(which the rails app ignores).
end

输出:

$ ruby my_sinatra_app.rb
== Sinatra (v1.4.6) has taken the stage on 4567 for development with backup from Thin
Thin web server (v1.6.4 codename Gob Bluth)
Maximum connections set to 1024
Listening on localhost:4567, CTRL+C to stop

received: {"x"=>"1", "y"=>"2"}
<20 second delay>
Sending response...

127.0.0.1 - - [11/Nov/2015:12:54:53 -0400] "POST /do_stuff HTTP/1.1" 200 18 20.0032

当您导航到 Rails 应用程序中的 some_action() 时,rails 服务器窗口将立即输出 ****Execution continues here--before received response.,sinatra服务器窗口会立即输出params散列,其中包含post请求中发送的数据。然后在延迟 20 秒后,sinatra 服务器窗口将输出 Sending response...

关于ruby - 如何在 Rails 中发出异步 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33625972/

相关文章:

ruby-on-rails - will_paginate 的total_entries 无法正常工作rails 4

ruby-on-rails - 如何访问仅存在于众多属性中的 1 个属性中的哈希值?

ruby-on-rails - Rails 与父索引的深度嵌套

ruby-on-rails - Devise 生成的代码在哪里?

ruby - 从 'next' 返回值是个坏主意吗?

ruby - Ruby Net::SFTP 的公钥/私钥身份验证

http - 如何绕过分配将锁定值复制到 tr : net/http. Transport contains sync.Mutex

ruby-on-rails - 当前版本的 rmagick gem (2.13.1) 不适用于当前版本的 ImageMagick (6.6.4)

apache - htaccess 文件规则

http - Varnish 和 ESI HTTP AUTH