我在辛纳屈(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。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top