Синатра, JavaScript междоменных запросов JSON - PullRequest
1 голос
/ 24 марта 2010

Я запускаю сборку REST-API поверх Sinatra. Теперь я хочу написать скрипт jQuery, который извлекает данные из API.

Синатре сказано ответить JSON

before do
  content_type :json
end

Простой маршрут выглядит как

get '/posts' do
  Post.find.to_json
end

Мой скрипт jQuery представляет собой простой вызов ajax

$.ajax({
  type: 'get',
  url: 'http://api.com/posts',
  dataType: 'json',
  success: function(data) {
     // do something
  }
})

На самом деле все работает нормально, если оба работают на одном IP, API и запрашивают JS. Я уже пытался поиграться с JSONP для Rack без каких-либо положительных результатов. Вероятно, мне просто нужна подсказка, как поступить.

Ответы [ 4 ]

5 голосов
/ 24 марта 2010

Используйте JSONP (JSON с отступом). Существует расширение JSONP для стойки.

Как правило, вы позвоните:

$.ajax({
  type: 'get',
  url: 'http://api.com/posts',
  dataType: 'jsonp',
  success: function(data) {
     // do something
  }
})

, что переводится как запрос

http://api.com/posts?callback=someJSFunc

и ваш сервер ответит, например ::

someJSFunc({"json":"obj"});

Конечно, клиенты могут выполнять запросы JSONP без jQuery. Хитрость с JSONP заключается в том, что вы обслуживаете сценарии, которые могут быть междоменными, а не чистыми JSON, и не могут.

4 голосов
/ 05 мая 2010

Это может быть интересно для вас http://github.com/shtirlic/sinatra-jsonp - это расширение добавляет недостающую функциональность в sinatra

Также доступно как драгоценный камень gem install sinatra-jsonp

4 голосов
/ 25 марта 2010

Спасибо за ответы до сих пор. Вы были правы, и jsonp решит проблему. Фрагменты кода для JavaScript работают нормально. Настроить Sinatra очень просто, так как он построен поверх стойки. Поэтому просто установите в стойку Contribute Gem

 gem install rack-rack-contrib --source=http://gems.github.com/

(или поместите его в свой Gemfile) и добавьте

require 'rack/contrib/jsonp'
use Rack::JSONP

к вашей заявке.

Это промежуточное ПО предоставляет обычный JSON для не-JSONP-клиентов и JSONP для jQuery & co.

0 голосов
/ 24 марта 2010

Попробуйте позвонить

$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });

В этом примере основным ключевым словом является конструкция "callback =?", Поэтому вам нужно обработать этот параметр в вашем серверном скрипте и создать действительный JSONP, например:

function({ "foo" : "bar" });

Где «функция» - это случайные данные, которые генерируются jQuery автоматически. Подробнее здесь о jQuery и междоменном JSONP.

...