【ASP.NET Core Web】JSONを受け取ってJSONを返す

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【ASP.NET Core Web】JSONを受け取ってJSONを返す

2023-8-25 |

ASP.NET Core WebでJSONを受け取ってJSONを返したい!

概要

今回の記事では、ASP.NET Core WebでJSONを受け取ってJSONを返す手順を掲載する。

仕様書

環境

  • .NET 7.0

手順書

[FromBody]を使う方法と使わない方法の2パターンでJSONを受け取ってJSONを返すログイン処理っぽい例を載せる。

[FromBody]を使う方法

[FromBody]を使う場合、予め受け取るJSONのフォーマットをクラスで宣言する。厳密に処理できる感じ。

using Microsoft.AspNetCore.Mvc;
using System.Text.Json;

namespace Sample.Controllers
{
    public class SampleController : Controller
    {
        public class JsonLogin
        {
            public string id { get; set; }
            public string name { get; set; }
        }

        [HttpPost]
        [AllowAnonymous]
        public JsonResult Index([FromBody] JsonLogin jsonLogin)
        {
            if (jsonLogin == null) {
                // 受信したJSONが読み取れない場合
                return Json(
                    new
                    {
                        code = "400",
                        message = "Bad Request.",
                    }
                );
            }

            // ログイン処理的な
            var result = Login(jsonLogin.id, jsonLogin.password);
            if (result == null)
            {
                // idとpasswordのいずれかあるいは両方が間違ってる場合
                return Json(
                    new
                    {
                        code = "401",
                        message = "Bad Request.",
                    }
                );
            }

            // ログインに成功した場合
            return Json(
                new
                {
                    code = "200",
                    message = "OK",
                }
            );
        }
    }
}

[FromBody]を使わない方法

[FromBody]を使わない場合は。JSONを受信してからパース後、必要なパラメーターの取得を試行する。柔軟に処理できる感じ。

この記事では標準のSystem.Text.Jsonを使ってJSONを処理してるんだけども、Newtonsoft.Jsonでも処理できる。

using Microsoft.AspNetCore.Mvc;
using System.Text.Json;
using System.Threading.Tasks;

namespace Sample.Controllers
{
    public class SampleController : Controller
    {
        [HttpPost]
        [AllowAnonymous]
        public async Task<JsonResult> Index()
        {
            using var reader = new StreamReader(Request.Body);
            var body = await reader.ReadToEndAsync();
            using var jsonDoc = JsonDocument.Parse(body);

            JsonElement root = jsonDoc.RootElement;

            // 受信したJSONのルートにidとpasswordが含まれてるか判定する
            if (
                root.TryGetProperty("id", out JsonElement idElement)
                    && root.TryGetProperty("password", out JsonElement passwordElement))
            {
                string id = idElement.GetString();
                string password = passwordElement.GetString();

                // ログイン処理的な
                var result = Login(id, password);
                if (result == null)
                {
                    // idとpasswordのいずれかあるいは両方が間違ってる場合
                    return Json(
                        new
                        {
                            code = "401",
                            message = "Bad Request.",
                        }
                    );
                }

                // ログインに成功した場合
                return Json(
                    new
                    {
                        code = "200",
                        message = "OK",
                    }
                );
            }

            // 受信したJSONに必須の情報(idとpassword)が含まれてない場合
            return Json(
                new
                {
                    code = "400",
                    message = "Bad Request.",
                }
            );
        }
    }
}

まとめ(感想文)

厳密か柔軟かを選択する感じ。

簡単なAPIを作るのに使えるかもね!