11

私は、REST API をバージョン管理するためのすべてのアプローチについて調べてきました。ほとんどすべての実装で、コントローラーとビューはバージョン管理されていますが、モデルはそうではありません。

レールの例を挙げると、コントローラーは次のように編成されます。

# app/controllers/api/v1/events_controller.rb
class Api::V1::EventsController < Api::ApiController

end

対応するビューも、異なるバージョンのディレクトリに配置されています。モデルをバージョン化しないのはなぜですか? API が進化しても、モデル (基礎となるデータベース スキーマ) が変わらないと期待しているからでしょうか? データベース内の列名の名前を変更し、それを説明する新しいモデルが必要な場合はどうなりますか?

4

2 に答える 2

15

モデルは、公開 API ではなく、アプリケーションの内部の一部です。バージョニングの際の鍵は、入出力がずれないようにすることです。

データベースで異なるバージョンのデータを維持すること (たとえば、異なるバージョンの API に属するデータ) は、特に魅力的でも実用的でもありません。

したがって、代わりにアダプター/シリアライザーを使用して、内部が現在のバージョンで実行されている間に、入力/出力を API の特定のバージョンに適合させます。

急いで API v 1 を公開したとします。

GET api/v1/users/:id
  username (String)
  first_name (String)
  lastname (String)

リリース後、ネーミングに一貫性がないことに気付きました。したがって、名前を に変更する移行を作成しlastnameますlast_name

したがって、API バージョン 2 には次の署名があります。

GET api/v2/users/:id
  username (String)
  first_name (String)
  last_name (String)

API v1しかし、応答に が含まれなくなったため、これは のテストを中断するはずlastnameです。

したがって、それを修正するには、次のようなものを作成します。

class Api::V1::UserSerializer < ActiveModel::Serializer
  attributes :username, :first_name, :lastname

  def lastname
    object.last_name
  end
end
于 2015-12-03T21:09:52.400 に答える