ASP.NET Core リクエストパラメーターがないエラーの対応方法 (original) (raw)
ASP.NET Core の APIコントローラーで、リクエストパラメーターが存在しないとエラーになることがありました。
以下に詳細と対応方法を記載していきます。
プロジェクトの概要
動作確認のために作成したプロジェクトは以下の通りです。
プロジェクトの作成方法は、こちら に記載しています。
目次
- エラーの詳細
- 対応方法
1. エラーの詳細
1.1. ソース
エラーが発生した APIコントローラーは以下の通りです。
Controllers/RequiredParamController.cs
using Microsoft.AspNetCore.Mvc;
namespace WebApiSample.Controllers { [ApiController] public class RequiredParamController : ControllerBase { [HttpGet("/req/name")] public Dictionary<string, string> Get(string name) { return new Dictionary<string, string>() { { "name", name } }; } } }
1.2. エラーになるリクエスト
コントローラーの引数に設定されるパラメーターが存在しないか、値が空のリクエストでエラーが発生しました。
http://localhost:5020/req/name
http://localhost:5020/req/name?name=
※ ポート番号はデバッグ実行時のものです。
1.3. エラー内容
リクエストに対するエラー内容(レスポンス)は以下の通りです。
{"type":"https://tools.ietf.org/html/rfc7231#section-6.5.1","title":"One or more validation errors occurred.","status":400,"traceId":"00-1f7382e61a26853a630258f094c15971-53389649c932488b-00","errors":{"name":["The name field is required."]}}
name が必須入力とのことです。
2. 対応方法
2.1. 引数をnull許容型にする方法
コントローラーの引数の型に「?」を付けると、null が認められてエラーが発生しなくなります。
変更前
string
変更後
string?
Controllers/RequiredParamController.cs
using Microsoft.AspNetCore.Mvc;
namespace WebApiSample.Controllers { [ApiController] public class RequiredParamController : ControllerBase { [HttpGet("/req/name")] public Dictionary<string, string> Get(string? name) { return new Dictionary<string, string>() { { "name", name } }; } } }
2.2. プロジェクトの設定を変更する方法
プロジェクトのプロパティを開いて、「Null 許容」を「無効化」に設定します。
この方法だと、コードを変更せずにエラーが解消されます。
2.3. 動作確認
上のいずれかの対応を行うと、パラメーターがないリクエストに対して、以下の JSONが返却されます。
{"name":null}