Sinatra, JavaScript Cross-Domain запросы JSON
-
22-09-2019 - |
Вопрос
Я управляю постройкой Rest-API на вершине Синатры. Теперь я хочу написать сценарий jQuery, который получает данные из API.
Синатре говорят ответить с JSON
before do
content_type :json
end
Простой маршрут выглядит как
get '/posts' do
Post.find.to_json
end
Мой сценарий jQuery-это простой
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'json',
success: function(data) {
// do something
}
})
На самом деле все работает нормально до тех пор, пока оба работают по одному IP, API и запрашиванию JS. Я уже пытался поиграть с JSONP для стойки без каких -либо положительных результатов. Наверное, мне просто нужен намек на то, как продолжить.
Решение
Использовать Jsonp (JSON с прокладкой). Eсть 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, с невозможно.
Другие советы
Спасибо за ответы до сих пор. Вы были правы, и JSONP решит проблему. Фрагменты кода для JavaScript работают нормально. Установить Sinatra очень просто, так как он строится на вершине стойки. Поэтому просто установите драгоценный камень контрибов
gem install rack-rack-contrib --source=http://gems.github.com/
(или положите в свой драгоценный камень) и добавьте
require 'rack/contrib/jsonp'
use Rack::JSONP
к вашему заявлению.
Это промежуточное программное обеспечение предоставляет регулярные JSON для клиентов Non-JSONP и JSONP для JQUERY & CO.
Это может быть интересно для вас http://github.com/shtirlic/sinatra-jsonp - Это расширение добавляет отсутствующую функциональность к Синатре
Также доступен в качестве драгоценного камня gem install sinatra-jsonp
Попробуй позвонить
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
В этом примере основное ключевое слово-это конструкция «callback =?», Поэтому вам нужно обработать этот параметр в своем скрипте на стороне сервера и сделать действительный JSONP, например:
function({ "foo" : "bar" });
Где «функция» представляет собой случайные данные, которые генерируются JQuery автоматически. Читать далее здесь О jQuery и Cross-Domain JSONP.