2011-11-16 13 views
0

我不確定我真的理解Sinatra是如何工作的。Rails Ajax - > Sinatra - >亞馬遜API並返回

我想從我的Rails應用程序中使用他們的API獲取一些亞馬遜的產品。但是HTTP請求阻止了IO。我得到了一個建議,即創建一個Sinatra應用程序,並向該應用程序發出Ajax請求。

阿賈克斯:(從我的Rails應用程序)

$.ajax({ 
    url: "http://sinatra.mydomain.com", 
    dataType: "json", 
    success: function(data) { 
    console.log(data); 
    } 
}); 

西納特拉應用:(我也利用西納特拉同步性寶石)

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 :(如果我在瀏覽器中訪問此Url,則呈現良好)

<%= amazon_product %> 

問題

我的Ajax響應是一個200 OK但空響應。
我無法弄清楚什麼是錯的。請指教。

+0

它是你真正的亞馬遜關鍵?我認爲這是值得隱藏的。 – WarHog

+0

菜鳥的錯誤:D – Frexuz

+0

我猜你的安裝程序會遇到與你的rails應用程序相同的問題。如果您使用的是事件機器相關的gem,其中rest-client根本就不是我所知的,那麼synchrony的同時/偶數io只會起作用。 – phoet

回答

2

看來你已經面對ajax'跨域安全'問題。嘗試使用JSONP(帶填充的JSON)。

更改西納特拉get處理程序:

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 

    content_type :json 
    callback = params.delete('callback') # jsonp 
    json = @item.to_json 

    if callback 
    content_type :js 
    response = "#{callback}(#{json})" 
    else 
    content_type :json 
    response = json 
    end 
    response 
end 

,改變你的阿賈克斯要求:

$.getJSON("http://address_of_sinatra?callback=?", 
    function(data) { 
    console.log(data); 
}); 

也可以添加dataType: 'jsonp'$.ajax請求。 之後,你應該看到js調試器中的data對象(至少它在我的情況下工作:D)

+0

太棒了!複製粘貼,它的工作原理! – Frexuz

+0

:)不客氣,很高興幫助你! – WarHog