1

Rails 4.0.4 と Grape 0.7.0 を使用して、次のように動作する REST API のスケルトンを作成しようとしています。

特定のバージョンで API を呼び出す:

$ curl -H Accept=application/vnd.acme-v1+json http://localhost:3000/api/a
“a-v1”
$ curl -H Accept=application/vnd.acme-v1+json http://localhost:3000/api/b
“b-v1”

デフォルトとして API を呼び出す:

$ curl http://localhost:3000/api/a
“a-v2”
$ curl http://localhost:3000/api/b
“b-v1”
$ curl http://localhost:3000/api/c
“c-v2”

私は試してきましたが、望ましい動作を得ることができませんでした。私のレールアプリには次のファイルがありました。

アプリ/api/api.rb

require 'grape'
require 'api_v1.rb'
require 'api_v2.rb'

module API
  class Base < Grape::API
    mount API::V2
    mount API::V1
  end
end

アプリ/api/api_v1.rb

require 'grape'

module API
  class V1 < Grape::API
    version 'v1', using: :header, vendor: 'acme', format: :json
    prefix 'api'
    format :json
    get :a do
      "a-v1"
    end
    get :b do
      "b-v1"
    end
  end
end

アプリ/api/api_v2.rb

require 'grape'

module API
  class V2 < Grape::API
    version ['v2', 'v1'], using: :header, vendor: 'acme', cascade: true
    prefix 'api'
    format :json
    get :a do
      "a-v2"
    end
    get :c do
      "c-v2"
    end
  end
end

app/config/routes.rb

...
mount API::Base => '/'
...

上記のファイルを使用すると、curl コマンドで指定したバージョンに関係なく、デフォルトの動作が得られます。

4

1 に答える 1

0

Grape では (私の知る限り)、API クラスでバージョン文字列の配列を指定することはできませんが、とにかくここでそれを行う必要はないと思います。また、curl 構文が正しくありません。

version行をapp/api/api_v2.rb次のように変更すると、コードが機能します

version 'v2', using: :header, vendor: 'acme', cascade: true

そして、パラメーターの正しい構文を使用して curl を呼び出し-Hます (等号の代わりにコロンを使用することに注意してください)。

$ curl -H Accept:application/vnd.acme-v1+json http://localhost:3000/api/a
"a-v1"
$ curl -H Accept:application/vnd.acme-v1+json http://localhost:3000/api/b
"b-v1"
$ curl http://localhost:3000/api/a
"a-v2"
$ curl http://localhost:3000/api/b
"b-v1"
$ curl http://localhost:3000/api/c
"c-v2"
于 2014-04-20T04:56:33.980 に答える