C# Academy · Lekcja

Integracja walidacji z API

Zwracaj przejrzyste odpowiedzi zawierające błędy walidacji.

Lekcja 4 z 413 kroki

Integracja walidacji z API to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Podłączanie FluentValidation do ASP.NET Core

Aby automatycznie walidować żądania, należy zarejestrować walidatory w mechanizmie wstrzykiwania zależności. Pomocnicza metoda AddValidatorsFromAssembly skanuje zestaw i rejestruje każdy znaleziony walidator.

using FluentValidation;

builder.Services
    .AddValidatorsFromAssemblyContaining<CustomerValidator>();

Automatyczne oprogramowanie pośredniczące walidacji

Współczesne FluentValidation preferuje jawną walidację, ale można włączyć walidację automatyczną, która integruje się z wiązaniem modelu, dzięki czemu niepoprawne żądania są odrzucane przed uruchomieniem metody akcji.

dotnet add package FluentValidation.AspNetCore

builder.Services.AddFluentValidationAutoValidation();

Walidatory rozwiązywane przez DI

Ponieważ walidatory są rejestrowane za pomocą DI, mogą wstrzykiwać usługi, takie jak repozytoria, dzięki czemu asynchroniczne reguły korzystające z bazy danych działają bezproblemowo w interfejsie API.

public class UserValidator : AbstractValidator<UserRequest>
{
    public UserValidator(IUserRepository repo)
    {
        RuleFor(u => u.Email)
            .MustAsync(async (e, ct) => !await repo.ExistsAsync(e));
    }
}

Jawna walidacja w punkcie końcowym

Wiele zespołów preferuje jawną walidację ze względu na czytelność. Należy wstrzyknąć IValidator<T> i wywołać go na początku handlera.

app.MapPost("/users", async (
    UserRequest request,
    IValidator<UserRequest> validator) =>
{
    var result = await validator.ValidateAsync(request);
    if (!result.IsValid)
        return Results.ValidationProblem(result.ToDictionary());
    return Results.Ok();
});

Czym jest ProblemDetails

ProblemDetails (RFC 7807) to standardowy format JSON dla odpowiedzi HTTP z błędami. Zawiera pola takie jak type, title, status i detail, zapewniając klientom przewidywalną strukturę błędu.

{
  "type": "https://tools.ietf.org/html/rfc7231",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "errors": { "Email": ["Email is required."] }
}

ValidationProblemDetails

W przypadku błędów walidacji ASP.NET Core używa ValidationProblemDetails, który rozszerza ProblemDetails o słownik errors mapujący każde pole na listę jego komunikatów.

return Results.ValidationProblem(result.ToDictionary());
// Produces a 400 ValidationProblemDetails response

Konwertowanie wyników FluentValidation

Metoda rozszerzająca ToDictionary() przekształca obiekt ValidationResult w słownik field -> messages, którego oczekuje metoda ValidationProblem.

var result = await validator.ValidateAsync(request);
if (!result.IsValid)
{
    IDictionary<string, string[]> errors = result.ToDictionary();
    return Results.ValidationProblem(errors);
}

Dostosowywanie danych wyjściowych ProblemDetails

Za pomocą AddProblemDetails i własnego konfiguratora można wzbogacić każdą odpowiedź z błędem, na przykład dodając identyfikator śledzenia ułatwiający debugowanie.

builder.Services.AddProblemDetails(options =>
{
    options.CustomizeProblemDetails = ctx =>
        ctx.ProblemDetails.Extensions["traceId"] =
            ctx.HttpContext.TraceIdentifier;
});

Walidacja w kontrolerach MVC

Przy włączonej automatycznej walidacji i użyciu [ApiController] akcje kontrolera automatycznie zwracają również obiekt ValidationProblemDetails, gdy żądanie jest nieprawidłowe, dzięki czemu format jest spójny we wszystkich endpointach.

[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
    [HttpPost]
    public IActionResult Create(UserRequest request) => Ok();
}

Filtr walidacji dla minimalnych interfejsów API

Można scentralizować jawną walidację za pomocą filtra endpointu, dzięki czemu każdy handler pozostaje przejrzysty.

app.MapPost("/users", (UserRequest r) => Results.Ok())
   .AddEndpointFilter<ValidationFilter<UserRequest>>();

Wybór walidacji automatycznej lub jawnej

Automatyczna walidacja jest wygodna, ale ukrywa etap walidacji; walidacja jawna wymaga więcej kodu, lecz jest przejrzysta i łatwiejsza do testowania. Wiele zespołów wybiera jawną walidację oraz współdzielony filtr, uzyskując zalety obu podejść.

Szybki test

Przetestuj integrację walidacji interfejsu API.

Podsumowanie

Integracja walidacji polega na zarejestrowaniu walidatorów za pomocą AddValidatorsFromAssembly, opcjonalnym włączeniu automatycznej walidacji oraz zwracaniu błędów jako ValidationProblemDetails za pomocą Results.ValidationProblem(result.ToDictionary()). DI umożliwia walidatorom korzystanie z repozytoriów w regułach asynchronicznych, a obiekty ProblemDetails można dostosować lub użyć filtrów endpointów, aby zachować przejrzystość handlerów.

Bezpłatny start

Ucz się C# dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
93
Lekcje
346

Często zadawane pytania

Czy lekcja „Integracja walidacji z API” jest bezpłatna?

Tak — pełny tekst „Integracja walidacji z API” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Integracja walidacji z API”?

Zwracaj przejrzyste odpowiedzi zawierające błędy walidacji. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Integracja walidacji z API”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Walidacja za pomocą adnotacji danych
  2. Reguły FluentValidation
  3. Reguły niestandardowe i warunkowe
  4. Integracja walidacji z API
← Powrót do C# Academy