C#のWebAPIクラスでRESTAPIを作る方法

DBにアクセスしてデータを取得し、レスポンスを作って返却する。

namespace TestProject.Controllers
{
    [Authorize] // 認証が必要になるアノテーション
    [RoutePrefix("api/test")] // [ドキュメントルート]/api/test/を指す
    public class TestAPIController : ApiController
    {
        
        /// <summary>
        /// データ取得
        /// </summary>
        /// <param name="paramPK"></param>
        /// <returns></returns>
        [Route("{paramPK}")] // ルートプレフィックス:[ドキュメントルート]/api/test/{paramPK} でアクセス可能
        [HttpGet] // HTTPメソッドを「GET」で指定
        public IHttpActionResult GetData(long paramPK)
        {
            using (var db = new ApplicationDBContext())
            {
            	// 存在チェック
                var test_tbl = db.TestTable1.Find(paramPK);

                if (test_tbl == null)
                {
                    return NotFound(); // HTTPステータス404で返せる
                }

                // パラメータから、別のテーブルの対象のデータを取得する。
                var test_tbl2 = db.TestTable2
                    .Where(tt => tt.FKTestTable1 == paramPK)
                    .FirstOrDefault();
                    
                // HTTPステータス200にBodyをセットして返せる
                return Ok(new
                {
                    // 返したいオブジェクトの形式を直接指定したい場合は new {}で中に要素を書く
                    test_tbl.p_name1,
                    test_tbl.p_name2,
                    test_tbl.p_name3,
                    PropatyNameX = test_tbl2 != null ? test_tbl2.name4 : null, // 三項演算子で値を設定
                });
            }
        }
     }

返したいオブジェクトの形式を固定したい場合はあらかじめModelを作成しておき、返却場所でModelをnewする。

            return new ResponceModel
            {
                ResParam1 = "aaa",
                ResParam2 = "bbb",
                ResParam3 = "ccc"
            };

通常、Bodyをセットできるのはステータスコード200の時のみだが、いずれのHTTPステータスの場合もレスポンスのBodyの形式を固定したい場合などは以下の「Content」メソッドを使用すれば対応できる

// 例えば403でBodyの形式を固定して返却したい場合
return Content(HttpStatusCode.Forbidden, [Bodyパラメータ]);

クラス全体で認証要としている状態で個別のメソッドだけ認証不要としたい場合、[AllowAnonymous]を追加

namespace TestProject.Controllers
{
    [Authorize] // 認証が必要になるアノテーション
    [RoutePrefix("api/test")] // [ドキュメントルート]/api/test/を指す
    public class TestAPIController : ApiController
    {   
        /// <summary>
        /// データ取得
        /// </summary>
        /// <param name="paramPK"></param>
        /// <returns></returns>
        [AllowAnonymous]
        [Route("{paramPK}")] 
        [HttpGet] 
        public IHttpActionResult GetData(long paramPK)
        {

コメントを残す