Web開発など

Java, JS, CSS, HTML, Unity, C# のことなどを書いてます。フリーソフトの公開もしています。

ASP.NET Core:APIコントローラーのリクエストパラメータがないとエラー

ASP.NET Core の APIコントローラーで、リクエストパラメータが存在しないとエラーになることがありました。

以下に詳細と対応方法を記載していきます。

コード例

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}
        };
    }
}

メソッドの引数にリクエストパラメータが設定されます。

エラーが発生するリクエス

引数に設定されるパラメータが存在しない、もしくはパラメータが空の場合にエラーが発生しました。

http://localhost:5113/api/name
http://localhost:5113/api/name?name=

※ ポート番号は自分の開発環境のものです。

エラー内容

エラー(レスポンス)は以下の通りでした。

{"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 が必須入力になっているようです。

対応方法

引数の stringstring? にするとエラーが発生しなくなりました。

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}

パラメータが存在しない可能性がある場合は、この対応方法で良いのかなと思いました。