1

我在 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

4 回答 4

5

使用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,不能。

于 2010-03-24T19:30:31.697 回答
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 & co 提供 JSONP。

于 2010-03-25T00:02:56.763 回答
4

你可能会感兴趣http://github.com/shtirlic/sinatra-jsonp——这个扩展为 sinatra 添加了缺失的功能

也可作为宝石gem install sinatra-jsonp

于 2010-05-05T16:43:41.593 回答
0

试着打电话

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

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

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

其中“function”是随机数据,由jQuery自动生成。在此处阅读有关 jQuery 和跨域 JSONP 的更多信息。

于 2010-03-24T19:41:55.713 回答