代码之家  ›  专栏  ›  技术社区  ›  pex

Sinatra,JavaScript跨域请求JSON

  •  1
  • pex  · 技术社区  · 14 年前

    我在Sinatra上运行了一个REST-API构建。

    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 回复  |  直到 14 年前
        1
  •  5
  •   Matthew Flaschen    14 年前

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

        2
  •  4
  •   pex    14 年前

    谢谢你的回答。 设置Sinatra是非常容易的,因为它是建立在机架顶部。 因此,只需安装机架contrib gem

     gem install rack-rack-contrib --source=http://gems.github.com/
    

    (或者把它放在你的文件中)并添加

    require 'rack/contrib/jsonp'
    use Rack::JSONP
    

    你的申请。

    这个中间件为非JSONP客户机提供常规JSON,为jQuery&提供JSONP;有限公司。

        3
  •  4
  •   Shtirlic    14 年前

    你可能会感兴趣 http://github.com/shtirlic/sinatra-jsonp

    也可用作宝石 gem install sinatra-jsonp

        4
  •  0
  •   Community CDub    7 年前

    试着打电话

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

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

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

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