ソリューションエクスプローラの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);
}
}
}
コメント