Help us understand the problem. What is going on with this article?

Rubyの並列HttpリクエストGem Typhoeusを使ってみる

More than 1 year has passed since last update.

Typhoeusのコードの例

あまりネットにコーディングの例が載っていなかったので自分で動かしてみました。apiのURLなどのは各自で用意してください。

前回記事

Rubyでhttpリクエストを並列処理

Gemのインストール

コマンドでインストール

gem install typhoeus 

Gemfileでインストール

gem 'typhoeus'

Railsで動かしてみる

railsのrakeファイルを作って動かしてみます。想定はapiにクエリを渡し並列化してhttpリクエストを送る。返ってきたjsonを保持することです。

rails g task typhoeus_task

//返ってくる create  lib/tasks/typhoeus_task.rake

すると、lib/tasks/にtyphoeus_task.rakeファイルができます。rakeとはruby+makeでc言語のmakeコマンドを思い浮かべてもらえばと思います。できたてのファイルは以下のようになっているはず。(#TODOは勝手に書いています)

 namespace :typhoeus_task do
  #TODO ここに内容を書く。                                             
 end          

これを次のように書く。urlやtokenは各自書き換えてください。注意点としては返ってくるjsonがそのままではUnicodeエスケープされている可能性があるので、そのままでは扱えないことがあります。JSON.load()に入れてやるとデコードしてくれます。

 namespace :typhoeus_task do
   task :para_request => :environment do

     search_items = ["a","b","c"]
     items = access_api(search_itmes)
     pp items
   end  

   def access_api(search_items)
     token = "aiueo" 
     url = "https://example.com/search"

     hydra = Typhoeus::Hydra.hydra

     requests = search_items.map do |s_item| 
       body_json = JSON.pretty_generate({"hogequery": s_item}) 

       header = {"Content-Type": "application/json", "X-Auth-Token": token}
       request = Typhoeus::Request.new(url, headers: header, method: :post, body: body_json, followlocation: true)
       hydra.queue(request) #キューに入れていく
       request #これが新しい配列に入っていく
     end

     hydra.run #httpリクエスト実行。結果はrequest.responseに入る

     # responseをjsonにして新しい配列を作る。
     responses = requests.map do |request|
       JSON.load(request.response.body)
     end

     return responses

 end     

そしてターミナルで次のように打つと動くようになる。

rails typhoeus_task:para_request

もしもっと良い書き方があるよって方がいれば、教えていただけると嬉しいです。

m-dove
福祉大好きエンジニア。時々しか実家に帰らなかったからか、あとから来た犬に下に見られています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away