Sinatra,JavaScript跨域请求JSON
我在Sinatra上运行REST-API构建。 现在我想编写一个从API中获取数据的jQuery脚本。
Sinatra被告知回应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 for Rack而没有任何积极的结果。 可能我只需要提示如何继续。
使用JSONP (带填充的JSON)。 Rack有一个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,但不能。
感谢目前为止的答案。 你是对的,jsonp会解决问题。 javascript的代码片段工作正常。 建立Sinatra很容易,因为它建立在Rack之上。 因此,只需安装rack-contrib gem
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添加了缺少的function
也可用作gemgem install sinatra-jsonp
试着打电话
$.getJSON("http://example.com/?callback=?",function(data) { alert(data); });
在此示例中,main关键字是构造“callback =?”,因此您需要在服务器端脚本中处理此参数,并生成有效的JSONP,如下所示:
function({ "foo" : "bar" });
其中“function”是随机数据,由jQuery自动生成。 阅读更多关于jQuery和跨域JSONP的内容。