2010-03-24 3 views
1

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

Синатра велят ответ с 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 без каких-либо положительных результатов. Наверное, мне просто нужно понять, как действовать.

ответ

5

Использование JSONP (JSON с прокладкой). Для стойки есть JSONP extension.

В принципе, вы будете звонить:

$.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, и не могут.

0

Try позвонить

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

В этом примере главного ключевого слова строительство «обратный вызов =?», Так что вам нужно обработать эти параметры в вашем серверном скрипте, и сделать правильный JSONP, как это:

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

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

4

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

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

(или положить его в Gemfile) и добавьте

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

к приложению.

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

+0

Чтобы было ясно, 'использование Rack :: JSONP' идет в верхней части Синатры класс (внутри класса) –

4

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

Также доступна в качестве драгоценного камня gem install sinatra-jsonp

Смежные вопросы