I’m not sure that I really understand how Sinatra works.
I’d like to get some products from Amazon using their API, in my Rails app. But HTTP requests are blocking the IO. I got the tip to create a Sinatra app and make an Ajax request to there instead.
Ajax: (From my Rails app)
$.ajax({
url: "http://sinatra.mydomain.com",
dataType: "json",
success: function(data) {
console.log(data);
}
});
Sinatra app: (I also make use of the Sinatra-synchrony gem)
require 'sinatra'
require 'sinatra/synchrony'
require 'erb'
require 'rest-client'
require 'amazon_product'
Sinatra::Synchrony.overload_tcpsocket!
get '/' do
req = AmazonProduct["us"]
req.configure do |c|
c.key = "KEY"
c.secret = "SECRET"
c.tag = "TAG"
end
req << { :operation => 'ItemSearch',
:search_index => "DVD",
:response_group => %w{ItemAttributes Images},
:keywords => "nikita",
:sort => "" }
resp = req.get
@item = resp.find('Item').shuffle.first
erb :layout, :locals => { :amazon_product => @item }
end
Layout.erb: (renders fine if I go to this Url in the browser)
<%= amazon_product %>
Problem:
My Ajax response is a 200 OK but with an empty response.
I’m can’t figure out what’s wrong. Please advise.
It seems that you’ve faced with ajax ‘cross-domain security’ problem. Try to use JSONP (JSON with padding).
Change your sinatra
gethandler:And change your Ajax request:
Or you can add
dataType: 'jsonp'to your$.ajaxrequest.After that you should see
dataobject in js debugger (at least it’s working in my case 😀 )