ASP.NET Core の APIコントローラーで、リクエストパラメーターが存在しないとエラーになることがありました。
以下に詳細と対応方法を記載していきます。
エラー内容
エラー内容(レスポンス)は以下の通りでした。
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-9c747263ca2a262920e2df3ebc91906d-e175a3e191afb22b-00","errors":{"name":["The name field is required."]}}
name
が必須入力になっているようです。
ソース
APIコントローラーのコード例は以下の通りです。
using Microsoft.AspNetCore.Mvc; [ApiController] public class NameController : ControllerBase { [HttpGet] [Route("api/name")] public Dictionary<string, string> Get(string name) { return new Dictionary<string, string>() { {"name", name} }; } }
メソッドの引数 name
にリクエストパラメータが設定されます。
エラーが発生するリクエスト
引数に設定されるパラメーターが存在しない、
http://localhost:5113/api/name
もしくは値が空のリクエストでエラーが発生しました。
http://localhost:5113/api/name?name=
※ ポート番号は自分の開発環境のものです。
対応方法
引数の string
を string?
にするとエラーが発生しなくなりました。
using Microsoft.AspNetCore.Mvc; [ApiController] public class NameController : ControllerBase { [HttpGet] [Route("api/name")] public Dictionary<string, string> Get(string? name) { return new Dictionary<string, string>() { {"name", name} }; } }
?
を付けると、null
を許容してくれるようです。対応後に name
を指定しないと、以下の JSON が返却されました。
{"name":null}
リクエストパラメーターが存在しない可能性がある場合は、この対応方法で良いのかなと思いました。