tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【ASP.NET API、C#】パターンによって様々なレスポンスを返す方法


小ネタ。オブジェクト志向を理解していれば当たり前の話と思われるかもしれませんが、割と使われてない感じがしたので書きます。

パターンによる様々なレスポンスとは?

RESTful APIでは、リクエストを受けてjsonで返すことが多いと思います。こんな感じで。

{
  "hoge1": "hoge1",
  "hoge2": "hoge2"
  }
}

特定のパターンだけ値を追加したい、または減らしたいときにプロパティを追加するとこんな感じになってしまいます。

{
  "hoge1": "hoge1",
  "hoge2": "", // ここだけ空だよ
  "hoge3": "hoge3" // 追加されてるよ!
  }
}

このままだとパターンによって増えたり減ったりしてカオスなAPIになるので、様々なパターンによってレスポンスをコントロールしたいときがあります。そもそもこんな感じになる前にAPI設計をちゃんとしろ思うかもしれませんが、生きてるサービスにそもそも論は通用しないのでどのように改善出来るかが、僕らの腕にかかってます。

本題に戻ります。

パターンによって複数のレスポンスを返す方法

ざっと説明すると、戻り値のクラスを継承するだけです。

    public class Hoge
    {
        public string Hoge1 { get; set; }
        public string Hoge2 { get; set; }

    }
    public class Hogeα : Hoge
    {
        public string Hogeα1 { get; set; }
        public string Hogeα2 { get; set; }
    }

        public Hoge Get()
        {
            var model = new Hoge();
            model.Hoge1 = "hoge1";
            model.Hoge2 = "hoge2";
            return model;
        }

        // GET api/values/5
        public Hoge Get(int id)
        {
            var model = new Hogeα();
            model.Hoge1 = "hoge1";
            model.Hoge2 = "hoge2";
            model.Hogeα1 = "newhoge1";
            model.Hogeα2 = "newhoge2";
            return model;
        }

派生クラスに拡張したいプロパティを指定して、基底クラスは必要最低限のプロパティで収めます。ここで鍵となるのは、戻り値に基底クラスを指定することです。基底クラスのHogeを指定すると派生クラスで拡張したいプロパティも含めてレスポンスが戻ってきます。

継承の包含関係は以下の図で表している通り、基底クラスに内包されたかたちで派生クラスが存在します。

なので、戻り値に基底クラスを指定しても派生クラスのプロパティを含めたレスポンスが戻ってくるという仕組みです(たぶん)

これを使えば、用途ごとのモデルを作って可読性が上がるので良いと思いました。多様しすぎて何のためのAPIかわからなくなってもいけないので、ほどほどにしましょう。