ASP.NETでWebApiを作成する

ソリューションエクスプローラのControllersを右クリックし、追加-コントローラーを押下する。

APIコントローラー-空を選択して追加を押下する。

追加するコントローラー名を入力して追加を押下する。今回は[ZipsController.cs]とした。

コード

レスポンスを格納するクラスをModelsに作成する。

namespace AspAddressBook.Models
{
    public class ResponseZip
    {
        /// <summary>
        /// 郵便番号
        /// </summary>
        public string? ZipCode { get; set; }

        /// <summary>
        /// 都道府県名
        /// </summary>
        public string? Pref { get; set; }

        /// <summary>
        /// 市区町村名
        /// </summary>
        public string? City { get; set; }

        /// <summary>
        /// 町域名
        /// </summary>
        public string? Town { get; set; }
    }
}

APIを作成する。

using AspAddressBook.Models;
using Microsoft.AspNetCore.Mvc;
using System.Text.RegularExpressions;

namespace AspAddressBook.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ZipsController : ControllerBase
    {
        private readonly ILogger<ZipsController> _logger;
        private readonly LearnContext _context;

        public ZipsController(ILogger<ZipsController> logger, LearnContext context)
        {
            _logger = logger;
            _context = context;
        }

        [HttpGet]
        public ActionResult<ResponseZip> Get(string? data)
        {
            // http://localhost:5087/api/Zips/?data=2720004
            if (data == null)
            {
                return BadRequest();
            }

            string zip = data.Replace("-", "");

            // 0000000以外はNG
            if (!Regex.IsMatch(zip, @"^[0-9]{7}$"))
            {
                return BadRequest();
            }

            // 郵便番号検索
            ResponseZip item = new ResponseZip();
            var result = _context.MstZips.Join(
                _context.MstCities,
                p => p.GovCode,
                c => c.GovCode,
                (p, c) => new
                {
                    p.ZipCode,
                    p.GovCode,
                    c.Pref,
                    c.City,
                    p.Town
                })
                .Where(x => x.ZipCode == zip)
                .ToList();

            // 検索結果が0の場合終了
            if (result.Any())
            {
                // フィールドを設定
                item.ZipCode = result[0].ZipCode;
                item.Pref = result[0].Pref;
                item.City = result[0].City;
                if (result.Count() == 1)
                {
                    // 町域名は検索結果が1件の場合のみ設定
                    item.Town = result[0].Town;
                }
            }

            return Ok(item);
        }
    }
}

コメント

タイトルとURLをコピーしました