Super basic concurrency based HTTP requester
View original Gist on GitHub
1. requester.rb
require "faraday"
require "json"
raw_json = <<-eos
{
"components": [
{
"id": "header",
"url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/header.json"
},
{
"id": "title",
"url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/title.json"
},
{
"id": "sidebar",
"url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/sidebar.json"
},
{
"id": "footer",
"url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/footer.json"
},
{
"id": "image",
"url": "https://gist.githubusercontent.com/revett/445ba84972156834a5df/raw/cb407f8c5348fb59d0448bd2b5573464e466cbc8/image.json"
}
]
}
eos
overall_status = "success"
component_status = "success"
threads = []
json = JSON.parse(raw_json)
components = json["components"]
components.size.times do |i|
threads << Thread.new do
time_start = Time.now
url = components[i-1]["url"]
response = Faraday.get url
time_end = Time.now
overall_status = component_status = "failure" if response.status != 200 || (time_end-time_start) > 2
{
:id => components[i-1]["id"],
:status => component_status,
:body => JSON.parse(response.body)["content"]
}
end
end
threads.each { |t| t.join }
result = {
:status => overall_status,
:components => threads.map { |t| t.value }
}
p JSON.generate(result)
2. Convert JSON response into a Ruby object.rb
{"status"=>"success",
"components"=>
[{"id"=>"image",
"status"=>"success",
"body"=>
"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
{"id"=>"header",
"status"=>"success",
"body"=>
"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
{"id"=>"title",
"status"=>"success",
"body"=>
"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
{"id"=>"sidebar",
"status"=>"success",
"body"=>
"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"},
{"id"=>"footer",
"status"=>"success",
"body"=>
"<p>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.</p>"}]}