2010-03-24 79 views
1

我在Sinatra之上運行REST-API構建。 現在我想編寫一個從API中獲取數據的jQuery腳本。Sinatra,JavaScript跨域請求JSON

西納特拉被告知要響應與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但沒有任何積極的結果。可能我只需要一個提示如何繼續。

回答

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

0

嘗試調用

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

在此示例中的主關鍵字是建設「回調=?」,所以你需要處理此PARAM在你的服務器端腳本,並進行了有效的JSONP,就像這樣:

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

其中「函數」是隨機數據,它是由jQuery自動生成的。閱讀更多關於jQuery和跨域JSONP的here

4

感謝迄今爲止的答案。 你說得對,jsonp會解決這個問題。 JavaScript的代碼片段工作正常。 建立Sinatra非常容易,因爲它建立在Rack之上。 因此只需安裝機架的contrib寶石

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

(或把它放在你的Gemfile),並添加

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

到您的應用程序。

該中間件爲非JSONP客戶端提供常規JSON,向jQuery提供JSONP & co。

+0

要明確的是,'使用機架:: JSONP'去你西納特拉的頂部班級(班內) – 2011-06-06 14:30:08