Sinatra,JavaScript跨域请求JSON
-
22-09-2019 - |
题
我在辛纳屈(Sinatra)的顶部经营一个休息。现在,我想编写一个jQuery脚本,该脚本从API中获取数据。
Sinatra被告知与Json回应
before do
content_type :json
end
一条简单的路线看起来像
get '/posts' do
Post.find.to_json
end
我的jQuery脚本是一个简单的ajax call
$.ajax({
type: 'get',
url: 'http://api.com/posts',
dataType: 'json',
success: function(data) {
// do something
}
})
实际上,只要两者都在同一IP,API和请求JS上运行,一切都可以正常工作。但是,我已经尝试与JSONP一起玩机架,但没有任何积极的结果。可能我只需要一个提示如何进行。
解决方案
利用 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"});
当然,客户可以在没有jQuery的情况下执行JSONP请求。 JSONP的诀窍是您提供脚本,可以是跨域而不是纯JSON,而不是纯JSON。
其他提示
感谢到目前为止的答案。您是对的,JSONP可以解决问题。 JavaScript的代码片段正常工作。设置Sinatra非常容易,因为它是在机架顶部建造的。因此,只需安装架子contrib宝石
gem install rack-rack-contrib --source=http://gems.github.com/
(或将其放入您的Gemfile)并添加
require 'rack/contrib/jsonp'
use Rack::JSONP
到您的申请。
该中间件为非JSONP客户端提供了常规的JSON,并向JQUERY&CO提供了JSONP。
这可能对你很有趣 http://github.com/shtirlic/sinatra-jsonp - 此扩展为Sinatra增加了缺少功能
也可以作为宝石 gem install sinatra-jsonp
尝试打电话
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
在此示例中,主要关键字是构造“回调=?”,因此您需要在服务器端脚本中处理此参数,并制作有效的JSONP,例如:
function({ "foo" : "bar" });
其中“函数”是随机数据,它是由jQuery自动生成的。阅读更多 这里 关于jQuery和跨域JSONP。
不隶属于 StackOverflow