Sinatra,JavaScript跨域请求JSON

时间:2010-03-24 19:26:40

标签: json jquery cross-domain sinatra rack

我在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而没有任何积极的结果。可能我只需要提示如何继续。

4 个答案:

答案 0 :(得分:5)

使用JSONP(带填充的JSON)。 Rack有一个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"});

当然,客户端可以在没有jQuery的情况下执行JSONP请求。使用JSONP的技巧是你提供脚本,它可以是跨域的,而不是纯JSON,但不能。

答案 1 :(得分:4)

感谢目前为止的答案。 你是对的,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&提供JSONP。共

答案 2 :(得分:4)

您可能感兴趣http://github.com/shtirlic/sinatra-jsonp - 此扩展程序为sinatra添加了缺少的功能

也可以作为gem gem install sinatra-jsonp

使用

答案 3 :(得分:0)

尝试致电

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

在此示例中,main关键字是构造“callback =?”,因此您需要在服务器端脚本中处理此参数,并生成有效的JSONP,如下所示:

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

其中“function”是随机数据,由jQuery自动生成。阅读更多关于jQuery和跨域JSONP的here