Rails Ajax -> Sinatra -> Amazon API и обратно - PullRequest
0 голосов
/ 17 ноября 2011

Я не уверен, что действительно понимаю, как работает Синатра.

Я бы хотел получить некоторые продукты от Amazon, используя их API, в моем приложении Rails. Но HTTP-запросы блокируют IO. Я получил совет создать приложение Sinatra и вместо этого сделать Ajax-запрос.

Ajax : (из моего приложения Rails)

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

Приложение Sinatra : (Я также использую камень Синатра-синхрония)

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, но с пустым ответом.
Я не могу понять, что не так. Пожалуйста, сообщите.

1 Ответ

2 голосов
/ 17 ноября 2011

Похоже, вы столкнулись с проблемой «междоменной безопасности» ajax.Попробуйте использовать JSONP (JSON с отступом).

Измените ваш обработчик sinatra 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

И измените ваш Ajax запрос:

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

Или вы можете добавить dataType: 'jsonp' к вашему запросу $.ajax.После этого вы должны увидеть объект data в отладчике js (по крайней мере, он работает в моем случае: D)

...