Skip to content

RFC 9457 Errors Sample

FluentValidation、ErrorOr、Endpoint FilterをRFC 9457 Problem Detailsへ接続するcompile可能な.NET 10 Minimal API例。

このsampleは既知のvalidation/application error経路に焦点を当てる。feature固有の処理をFeatures、横断的なProblem Details生成とvalidationをSharedへ配置する。

text
Features/Widgets/
├── WidgetEndpoints.cs
├── WidgetErrors.cs
└── Create/
    ├── WidgetCreateEndpoint.cs
    ├── WidgetCreateHandler.cs
    ├── WidgetCreateCommand.cs
    ├── WidgetCreateResult.cs
    ├── WidgetCreateRequest.cs
    ├── WidgetCreateRequestValidator.cs
    └── WidgetCreateResponse.cs
Infrastructure/
└── WidgetServiceCollectionExtensions.cs
Shared/
├── Api/
│   ├── ApiProblemResults.cs
│   └── ProblemTypeOptions.cs
└── Validation/
    ├── FailFastValidator.cs
    └── RequestValidationFilter.cs

Demonstrates

  • FailFastValidator<T>がrule chain内とvalidator全体を停止し、宣言順の最初のfailureだけを返す。
  • RequestValidationFilter<TRequest>がendpoint実行前に検証し、失敗をProblemHttpResultへ変換する。
  • ApiProblemResultsが絶対type URI、HTTP statusと一致するstatus、安定したtitle、安全なdetail、単数codeを生成する。
  • Endpointがvalidated Request DTOをCommandへ変換し、HandlerはHTTP型を扱わずErrorOr<WidgetCreateResult>を返す。業務エラーはWidgetErrorsへ集約し、EndpointはResultをResponse DTOへ変換して先頭errorだけをProblem Detailsへmappingする。
  • Program.csapp.MapWidgetApi()だけを呼び、Area route groupはWidgetEndpoints、use case固有のroute mappingとfilter登録はWidgetCreateEndpoint.MapCreateApiへ閉じ込める。

このsampleはFluentValidationとErrorOrから返す既知のAPI errorを対象にする。malformed JSON、model binding failure、想定外例外を含むAPI全体のerror pipelineは../../references/validation.mdの規則に従って別途構成する。 NameQuantityの規則はこのsampleではHTTP request制約であり、domain invariantやpersistence contractを表さない。

Build

bash
dotnet build Rfc9457Errors.Sample.csproj

Response example

NameQuantityが両方不正でも、宣言順で最初のName failureだけを返す。

json
{
    "type": "https://example.com/problems/invalid-request",
    "title": "Invalid request",
    "status": 400,
    "detail": "Name is required.",
    "code": "widget.name_required"
}

response media typeはapplication/problem+jsonerrors配列とfield pointerは返さない。