2013-02-02 33 views
23

すべてのAPIコントローラへのリクエストをJSONパスにリダイレクトするように制限したいと思います。リダイレクトを使用したいのですが、レスポンスに応じてURLを変更する必要があるためです。
1つのオプションは、要求を同じアクションにリダイレクトするが、JSON形式を強制するbefore_filterを使用することです。この例はまだ動作していません!Rails:JSON形式へのAPIリクエストの制限

# base_controller.rb 
class Api::V1::BaseController < InheritedResources::Base 
    before_filter :force_response_format 
    respond_to :json 
    def force_response_format 
    redirect_to, params[:format] = :json 
    end 
end 

もう1つのオプションは、経路設定の形式を制限することです。

# routes.rb 
MyApp::Application.routes.draw do 
    namespace :api, defaults: { format: 'json' } do 
    namespace :v1 do 
     resources :posts 
    end 
    end 
end 

私はすべての要求がJSONリクエストとして終わるしたい:

戦略は、あなたが推薦する
http://localhost:3000/api/v1/posts 
http://localhost:3000/api/v1/posts.html 
http://localhost:3000/api/v1/posts.xml 
http://localhost:3000/api/v1/posts.json 
... 

答えて

5

第2のオプションは、経路フォーマットを使用します。ユーザーが明示的にXML形式を要求した場合、JSON応答を受け取るべきではありません。彼は、このURLがXML形式、または404に答えていないというメッセージを受け取るべきです。

ところで、私の意見ではあなたがすべきことすべてに対応するのはむしろ簡単です。

class FooController 
    respond_to :xml, :json 
    def show 
    @bar = Bar.find(params[:id]) 
    respond_with(@bar) 
    end 
end 
+0

+1コメントの先頭です。私の経験ではフォーマットを追加するのは簡単ではありませんが、Railsは実装が簡単です。 APIデザイナーは、さらなるフォーマットをサポートすることが何を意味しているかを、すべての意味を考慮して考えなければなりません。 –

19

ルートにデフォルトを設定しても、すべてのリクエストがJSONリクエストに変換されるわけではありません。何をしたい

は、あなたが行くと、この

before_filter :set_default_response_format 

private 
    def set_default_response_format 
    request.format = :json 
    end 

を行う必要がある以外、あなたがレンダリングしているものは何でもするとJSONレスポンス

であることを確認してくださいあなたはかなり最初のオプションでそれを持っていたようにすることですあなたのBase APIコントローラの下で、あなたの実際のアクションになると、そのフォーマットは常にJSONになります。フォーマットは:jsonでない場合は、404を返す、またはRouteNotFoundエラーが発生する場合

+0

'request.format'を':json'に設定すると、すべての応答がJSONを返すという問題を解決します。ただし、アドレスバーのURLは変更されません。 – JJD

+0

APIを使用している場合、なぜアドレスバーにURLを書き込む必要がありますか?リダイレクトを行うと300ステータスが返ってきて、おそらくそれが最も効率的ではないことに注意してください。 –

+0

これは、どのような場合でもリクエストフォーマットをJSONに書き換えることをお勧めしますか?もう1つのオプションは、HTTPステータスをmathieugagneとして返すことです。 – JJD

16

、私はこのようなルートの制約を追加します。

# routes.rb 
MyApp::Application.routes.draw do 
    namespace :api, constraints: { format: 'json' } do 
    namespace :v1 do 
     resources :posts 
    end 
    end 
end 

詳細情報:

はJSON形式を要求しますここに見つけることができます: http://edgeguides.rubyonrails.org/routing.html#request-based-constraints

+0

私はこの場合、406がより正確な応答であると主張します。このアプローチが404を返す理由は何ですか? – asymmetric