1

Sinatra の上で REST-API ビルドを実行します。ここで、API からデータをフェッチする jQuery スクリプトを書きたいと思います。

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 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 ではなくクロスドメインであるスクリプトを、cant で提供することです。

于 2010-03-24T19:30:31.697 に答える
4

あなたにとって興味深いかもしれませんhttp://github.com/shtirlic/sinatra-jsonp — この拡張機能はsinatraに不足している機能を追加します

宝石としても入手可能gem install sinatra-jsonp

于 2010-05-05T16:43:41.593 に答える
4

これまでの回答に感謝します。あなたは正しかったし、jsonp は問題を解決します。JavaScript のコード スニペットは問題なく動作します。Sinatra はラックの上に構築されているため、セットアップは非常に簡単です。したがって、rack-contrib gemをインストールするだけです

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

(またはGemfileに入れて)追加します

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

あなたのアプリケーションに。

このミドルウェアは、通常の JSON を非 JSONP クライアントに提供し、JSONP を jQuery & co に提供します。

于 2010-03-25T00:02:56.763 に答える
0

電話してみてください

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

このサンプルのメインキーワードは構築"callback=?"であるため、サーバー側スクリプトでこのパラメーターを処理し、次のように有効なJSONPを作成する必要があります。

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

ここで、「関数」はランダムデータであり、jQueryによって自動的に生成されます。jQueryとクロスドメインJSONPについて詳しくはこちらをご覧ください。

于 2010-03-24T19:41:55.713 に答える