Formátování dat odpovědí ve webovém rozhraní API ASP.NET Core

ASP.NET Core MVC podporuje formátování dat odpovědi pomocí zadaných formátů nebo v reakci na požadavek klienta.

Výsledky akce specifické pro konkrétní formát

Některé typy výsledků akce jsou specifické pro určitý formát, například JsonResult a ContentResult. Akce můžou vracet výsledky, které vždy používají zadaný formát a ignorují požadavek klienta na jiný formát. Například vrácení JsonResult vrátí data JSve formátu ON a vrácení vrátí ContentResult řetězcová data ve formátu prostého textu.

Akce není nutná k vrácení žádného konkrétního typu. ASP.NET Core podporuje libovolnou vrácenou hodnotu objektu. Výsledky z akcí, které vracejí objekty, které nejsou IActionResult typy, jsou serializovány pomocí příslušné IOutputFormatter implementace. Další informace najdete v tématu Návratové typy akcí kontroleru ve webovém rozhraní API ASP.NET Core.

Ve výchozím nastavení integrovaná pomocná metoda ControllerBase.Ok vrací JSon-formatted data:

[HttpGet]
public IActionResult Get() =>
    Ok(_todoItemStore.GetList());

Vzorový kód vrátí seznam položek úkolů. Pomocí vývojářských nástrojů prohlížeče F12 nebo http-repl s předchozím kódem se zobrazí:

  • Hlavička odpovědi obsahující typ obsahu:application/json; charset=utf-8.
  • Hlavičky požadavku. Například Accept záhlaví. Hlavička Accept je ignorována předchozím kódem.

Pokud chcete vrátit data ve formátu prostého textu, použijte ContentResult a pomocné rutiny Content :

[HttpGet("Version")]
public ContentResult GetVersion() =>
    Content("v1.0.0");

V předchozím kódu je text/plainvrácena Content-Type .

Pro akce s více návratovými typy, vraťte IActionResult. Například při vracení různých stavových kódů HTTP na základě výsledku operace.

Vyjednávání obsahu

Vyjednávání obsahu nastane, když klient určuje hlavičku Accept. Výchozí formát používaný ASP.NET Core je JSzapnutý. Vyjednávání obsahu je:

  • Implementoval .ObjectResult
  • Integrované do výsledků akcí specifických pro stavový kód vrácených z pomocných metod. Pomocné metody výsledků akce jsou založeny na ObjectResult.

Při vrácení typu modelu je ObjectResultnávratový typ .

Následující metoda akce používá OkNotFound pomocné metody:

[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
    var todo = _todoItemStore.GetById(id);

    if (todo is null)
    {
        return NotFound();
    }

    return Ok(todo);
}

Ve výchozím nastavení ASP.NET Core podporuje následující typy médií:

  • application/json
  • text/json
  • text/plain

Nástroje, jako je Fiddler nebo Postman , můžou nastavit hlavičku Accept požadavku tak, aby určila návratový formát. Pokud hlavička Accept obsahuje typ, který server podporuje, vrátí se tento typ. V další části se dozvíte, jak přidat další formátování.

Akce kontroleru můžou vracet objekty POCOs (prosté staré objekty CLR). Při vrácení poco modul runtime automaticky vytvoří ObjectResult objekt, který objekt zabalí. Klient získá formátovaný serializovaný objekt. Pokud je nullvrácen objekt , 204 No Content vrátí se odpověď.

Následující příklad vrátí typ objektu:

[HttpGet("{id:long}")]
public TodoItem? GetById(long id) =>
    _todoItemStore.GetById(id);

V předchozím kódu vrátí požadavek na platnou 200 OK položku úkolu odpověď. Požadavek na neplatnou položku úkolu vrátí 204 No Content odpověď.

Hlavička Accept

Vyjednávání obsahu probíhá, když Accept se v požadavku zobrazí záhlaví. Pokud požadavek obsahuje hlavičku accept, ASP.NET Core:

  • Vytvoří výčet typů médií v hlavičce accept v pořadí předvoleb.
  • Pokusí se najít formátovací modul, který může vytvořit odpověď v jednom ze zadaných formátů.

Pokud se nenajde žádný formátovací modul, který by mohl vyhovět požadavku klienta, ASP.NET Core:

  • Vrátí 406 Not Acceptable hodnotu, je-li MvcOptions.ReturnHttpNotAcceptable nastavena na truehodnotu , nebo -
  • Pokusí se najít první formátovací modul, který může vytvořit odpověď.

Pokud není pro požadovaný formát nakonfigurovaný žádný formát, použije se první formátovací modul, který může formátovat objekt. Pokud se v požadavku nezobrazí žádná Accept hlavička:

  • První formátovací modul, který dokáže zpracovat objekt, se používá k serializaci odpovědi.
  • Neprobíhá žádné vyjednávání. Server určuje, jaký formát se má vrátit.

Pokud hlavička Accept obsahuje */*, je hlavička ignorována, pokud RespectBrowserAcceptHeader není nastavena na hodnotu true on MvcOptions.

Prohlížeče a vyjednávání obsahu

Na rozdíl od typických klientů rozhraní API poskytují Accept webové prohlížeče hlavičky. Webové prohlížeče určují mnoho formátů, včetně zástupných znaků. Když rozhraní ve výchozím nastavení zjistí, že požadavek pochází z prohlížeče:

  • Záhlaví Accept se ignoruje.
  • Obsah se vrátí v JSZAPNUTO, pokud není nakonfigurovaný jinak.

Tento přístup poskytuje konzistentnější prostředí napříč prohlížeči při využívání rozhraní API.

Pokud chcete nakonfigurovat aplikaci tak, aby respektovala hlavičky přijetí prohlížeče, nastavte RespectBrowserAcceptHeader vlastnost na true:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.RespectBrowserAcceptHeader = true;
});

Konfigurace formátovacích souborů

Aplikace, které potřebují podporovat další formáty, můžou přidat příslušné balíčky NuGet a nakonfigurovat podporu. Existují samostatné formátovací moduly pro vstup a výstup. Vstupní formátovací moduly používají vazby modelu. Výstupní formátovací moduly se používají k formátování odpovědí. Informace o vytvoření vlastního formátovače naleznete v tématu Vlastní formátovací moduly.

Přidání podpory formátu XML

Konfigurace formátovacích souborů XML implementovaných pomocí XmlSerializervolání AddXmlSerializerFormatters:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddXmlSerializerFormatters();

Při použití předchozího kódu vrátí metody kontroleru odpovídající formát na základě hlavičky Accept požadavku.

Konfigurace System.Text.Jsonformátovacích souborů založených na

Ke konfiguraci funkcí pro System.Text.Jsonformátovací moduly Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptionszaložené na jazyce . Následující zvýrazněný kód místo výchozího formátování camelCase konfiguruje formátování PascalCase:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

Následující volání metody ControllerBase.Problem akce k vytvoření ProblemDetails odpovědi:

[HttpGet("Error")]
public IActionResult GetError() =>
    Problem("Something went wrong.");

ProblemDetails Odpověď je vždy camelCase, i když aplikace nastaví formát na PascalCase. ProblemDetails se řídí dokumentem RFC 7807, který určuje malá písmena.

Chcete-li konfigurovat možnosti serializace výstupu pro konkrétní akce, použijte JsonResult. Příklad:

[HttpGet]
public IActionResult Get() =>
    new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerOptions
        {
            PropertyNamingPolicy = null
        });

JSPřidání Newtonsoft.Jsonpodpory formátu ON

Výchozí JSformátovací moduly ON používají System.Text.Json. Pokud chcete použít Newtonsoft.Jsonformátovací moduly založené na základech, nainstalujte Microsoft.AspNetCore.Mvc.NewtonsoftJson balíček NuGet a nakonfigurujte ho v Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson();

V předchozím kódu volání AddNewtonsoftJson konfiguruje následující funkce webového rozhraní API, MVC a Razor Pages, které se mají použít Newtonsoft.Json:

Některé funkce nemusí dobře fungovat s formátovacími System.Text.Jsonmoduly založenými na nich a vyžadují odkaz na Newtonsoft.Jsonformátovací nástroje. Pokračujte v používání Newtonsoft.Jsonformátovacích metod založených na aplikaci:

  • Používá Newtonsoft.Json atributy. Například [JsonProperty] nebo [JsonIgnore].
  • Přizpůsobí nastavení serializace.
  • Spoléhá na funkce, které Newtonsoft.Json poskytuje.

Ke konfiguraci funkcí pro Newtonsoft.Jsonformátovací moduly SerializerSettingszaložené na :

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

Chcete-li konfigurovat možnosti serializace výstupu pro konkrétní akce, použijte JsonResult. Příklad:

[HttpGet]
public IActionResult GetNewtonsoftJson() =>
    new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerSettings
        {
            ContractResolver = new DefaultContractResolver()
        });

Zadání formátu

Chcete-li omezit formáty odpovědí, použijte [Produces] filtr. Podobně jako u většiny filtrů[Produces] je možné použít akce, kontroleru nebo globálního oboru:

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase

Předchozí [Produces] filtr:

  • Vynutí všechny akce v kontroleru tak, aby vracely JSodezvy na formátované on-formatted pro objekty POCO (Plain Old CLR Objects) nebo ObjectResult jeho odvozené typy.
  • Vrácení JSodpovědí ve formátu ON, i když jsou nakonfigurované jiné formátovací moduly a klient určuje jiný formát.

Další informace najdete v tématu Filtry.

Speciální formátovací moduly pro velká písmena

Některé speciální případy se implementují pomocí integrovaných formátovacích metod. Ve výchozím nastavení string jsou návratové typy formátované jako text/prostý text (text/html , pokud se požaduje prostřednictvím hlavičky Accept ). Toto chování lze odstranit odebráním souboru StringOutputFormatter. Formátovací moduly jsou odebrány v Program.cs. Akce, které mají návratový typ 204 No Content objektu modelu při vrácení null. Toto chování lze odstranit odebráním souboru HttpNoContentOutputFormatter. Následující kód odebere znak a StringOutputFormatterHttpNoContentOutputFormatter.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // using Microsoft.AspNetCore.Mvc.Formatters;
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
    options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});

StringOutputFormatterBez integrovaného JSformátovače string ON vrací typy. Pokud je integrovaný JSformátovací modul ON odebrán a je k dispozici formátovací modul XML, formátovací modul string XML vrátí typy. string V opačném případě vrátí návratové 406 Not Acceptabletypy .

Bez objektu HttpNoContentOutputFormatternull jsou formátovány pomocí konfigurovaného formátovače. Příklad:

  • Formátovací JSmodul ON vrátí odpověď s textem null.
  • Formátovací modul XML vrátí prázdný element XML se sadou atributů xsi:nil="true" .

Mapování adres URL formátu odpovědi

Klienti můžou v rámci adresy URL požadovat určitý formát, například:

  • V řetězci dotazu nebo části cesty.
  • Pomocí přípony souboru specifického pro konkrétní formát, například .xml nebo .json.

Mapování z cesty požadavku by mělo být zadané ve směrování, které rozhraní API používá. Příklad:

[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
    private readonly TodoItemStore _todoItemStore;

    public TodoItemsController(TodoItemStore todoItemStore) =>
        _todoItemStore = todoItemStore;

    [HttpGet("{id:long}.{format?}")]
    public TodoItem? GetById(long id) =>
        _todoItemStore.GetById(id);

Předchozí trasa umožňuje zadat požadovaný formát pomocí volitelné přípony souboru. Atribut [FormatFilter] kontroluje existenci hodnoty formátu v RouteData řetězci a mapuje formát odpovědi na příslušný formátovací modul při vytvoření odpovědi.

Postup Formátovací modul
/api/todoitems/5 Výchozí výstupní formátovací modul
/api/todoitems/5.json Formátovací JSmodul ON (pokud je nakonfigurovaný)
/api/todoitems/5.xml Formátovací modul XML (pokud je nakonfigurovaný)

Polymorfní deserializace

Integrované funkce poskytují omezený rozsah polymorfní serializace, ale vůbec žádná podpora deserializace. Deserializace vyžaduje vlastní převaděč. Úplný vzorek polymorfní deserializace najdete v tématu Polymorfní deserializace.

Další materiály

ASP.NET Core MVC podporuje formátování dat odpovědi. Data odpovědí můžou být formátována pomocí konkrétních formátů nebo v reakci na požadovaný formát klienta.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Výsledky akce specifické pro konkrétní formát

Některé typy výsledků akce jsou specifické pro určitý formát, například JsonResult a ContentResult. Akce můžou vracet výsledky, které jsou formátovány v určitém formátu bez ohledu na předvolby klienta. Například vrácení JsonResult vrátí data JSve formátu ON. Vrácení ContentResult nebo řetězec vrátí data řetězce ve formátu prostého textu.

Akce není nutná k vrácení žádného konkrétního typu. ASP.NET Core podporuje libovolnou vrácenou hodnotu objektu. Výsledky z akcí, které vracejí objekty, které nejsou IActionResult typy, jsou serializovány pomocí příslušné IOutputFormatter implementace. Další informace najdete v tématu Návratové typy akcí kontroleru ve webovém rozhraní API ASP.NET Core.

Integrovaná pomocná metoda Ok vrátí JSdata ve formátu ON:

// GET: api/authors
[HttpGet]
public ActionResult Get()
{
    return Ok(_authors.List());
}

Ukázkové stažení vrátí seznam autorů. Použití vývojářských nástrojů prohlížeče F12 nebo http-repl s předchozím kódem:

  • Zobrazí se hlavička odpovědi obsahující typ obsahu:application/json; charset=utf-8
  • Zobrazí se hlavičky požadavku. Například Accept záhlaví. Hlavička Accept je ignorována předchozím kódem.

Pokud chcete vrátit data ve formátu prostého textu, použijte ContentResult a pomocné rutiny Content :

// GET api/authors/about
[HttpGet("About")]
public ContentResult About()
{
    return Content("An API listing authors of docs.asp.net.");
}

V předchozím kódu je text/plainvrácena Content-Type . Vrácení řetězce s informacemi Content-Typetext/plaino:

// GET api/authors/version
[HttpGet("version")]
public string Version()
{
    return "Version 1.0.0";
}

Pro akce s více návratovými typy, vraťte IActionResult. Například vrácení různých stavových kódů HTTP na základě výsledku provedených operací.

Vyjednávání obsahu

Vyjednávání obsahu nastane, když klient určuje hlavičku Accept. Výchozí formát používaný ASP.NET Core je JSzapnutý. Vyjednávání obsahu je:

  • Implementoval .ObjectResult
  • Integrované do výsledků akcí specifických pro stavový kód vrácených z pomocných metod. Pomocné metody výsledků akce jsou založeny na ObjectResult.

Při vrácení typu modelu je ObjectResultnávratový typ .

Následující metoda akce používá OkNotFound pomocné metody:

// GET: api/authors/search?namelike=th
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
    var result = _authors.GetByNameSubstring(namelike);
    if (!result.Any())
    {
        return NotFound(namelike);
    }
    return Ok(result);
}

Ve výchozím nastavení ASP.NET Core podporuje application/jsona text/jsontext/plain typy médií. Nástroje, jako je Fiddler nebo http-repl , můžou nastavit hlavičku Accept požadavku tak, aby určila návratový formát. Pokud hlavička Accept obsahuje typ, který server podporuje, vrátí se tento typ. V další části se dozvíte, jak přidat další formátování.

Akce kontroleru můžou vracet objekty POCOs (prosté staré objekty CLR). Při vrácení poco modul runtime automaticky vytvoří ObjectResult objekt, který objekt zabalí. Klient získá formátovaný serializovaný objekt. Pokud je nullvrácen objekt , 204 No Content vrátí se odpověď.

Vrácení typu objektu:

// GET api/authors/RickAndMSFT
[HttpGet("{alias}")]
public Author Get(string alias)
{
    return _authors.GetByAlias(alias);
}

V předchozím kódu vrátí 200 OK požadavek na platný alias autora odpověď s daty autora. Požadavek na neplatný alias vrátí 204 No Content odpověď.

Hlavička Accept

Vyjednávání obsahu probíhá, když Accept se v požadavku zobrazí záhlaví. Pokud požadavek obsahuje hlavičku accept, ASP.NET Core:

  • Vytvoří výčet typů médií v hlavičce accept v pořadí předvoleb.
  • Pokusí se najít formátovací modul, který může vytvořit odpověď v jednom ze zadaných formátů.

Pokud se nenajde žádný formátovací modul, který by mohl vyhovět požadavku klienta, ASP.NET Core:

  • Vrátí 406 Not Acceptable hodnotu, je-li MvcOptions.ReturnHttpNotAcceptable nastavena na truehodnotu , nebo -
  • Pokusí se najít první formátovací modul, který může vytvořit odpověď.

Pokud není pro požadovaný formát nakonfigurovaný žádný formát, použije se první formátovací modul, který může formátovat objekt. Pokud se v požadavku nezobrazí žádná Accept hlavička:

  • První formátovací modul, který dokáže zpracovat objekt, se používá k serializaci odpovědi.
  • Neprobíhá žádné vyjednávání. Server určuje, jaký formát se má vrátit.

Pokud hlavička Accept obsahuje */*, je hlavička ignorována, pokud RespectBrowserAcceptHeader není nastavena na hodnotu true on MvcOptions.

Prohlížeče a vyjednávání obsahu

Na rozdíl od typických klientů rozhraní API poskytují Accept webové prohlížeče hlavičky. Webové prohlížeče určují mnoho formátů, včetně zástupných znaků. Když rozhraní ve výchozím nastavení zjistí, že požadavek pochází z prohlížeče:

  • Záhlaví Accept se ignoruje.
  • Obsah se vrátí v JSZAPNUTO, pokud není nakonfigurovaný jinak.

Tento přístup poskytuje konzistentnější prostředí napříč prohlížeči při využívání rozhraní API.

Pokud chcete nakonfigurovat aplikaci tak, aby respektovali hlavičky, které prohlížeč přijímá, nastavte RespectBrowserAcceptHeader na true:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.RespectBrowserAcceptHeader = true; // false by default
    });
}

Konfigurace formátovacích souborů

Aplikace, které potřebují podporovat další formáty, můžou přidat příslušné balíčky NuGet a nakonfigurovat podporu. Existují samostatné formátovací moduly pro vstup a výstup. Vstupní formátovací moduly používají vazby modelu. Výstupní formátovací moduly se používají k formátování odpovědí. Informace o vytvoření vlastního formátovače naleznete v tématu Vlastní formátovací moduly.

Přidání podpory formátu XML

Formátovací moduly XML implementované pomocí XmlSerializerAddXmlSerializerFormattersvolání:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddXmlSerializerFormatters();
}

Předchozí kód serializuje výsledky pomocí XmlSerializer.

Při použití předchozího kódu vrátí metody kontroleru odpovídající formát na základě hlavičky Accept požadavku.

Konfigurace System.Text.Json na základě formátování

Funkce pro System.Text.Json založené formátovací moduly lze nakonfigurovat pomocí Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Výchozí formátování je camelCase. Následující zvýrazněný kód nastaví formátování PascalCase:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddJsonOptions(options =>
            options.JsonSerializerOptions.PropertyNamingPolicy = null);
}

Následující volání metody ControllerBase.Problem akce k vytvoření ProblemDetails odpovědi:

[HttpGet("error")]
public IActionResult GetError()
{
    return Problem("Something went wrong!");
}

S předchozím kódem:

  • https://localhost:5001/WeatherForecast/temperature vrátí PascalCase.
  • https://localhost:5001/WeatherForecast/error vrátí camelCase. Chybová odpověď je vždy camelCase, i když aplikace nastaví formát na PascalCase. ProblemDetails se řídí dokumentem RFC 7807, který určuje malá písmena.

Následující kód nastaví PascalCase a přidá vlastní převaděč:

services.AddControllers().AddJsonOptions(options =>
{
    // Use the default property (Pascal) casing.
    options.JsonSerializerOptions.PropertyNamingPolicy = null;

    // Configure a custom converter.
    options.JsonSerializerOptions.Converters.Add(new MyCustomJsonConverter());
});

Možnosti serializace výstupu, na základě akce, lze nakonfigurovat pomocí JsonResult. Příklad:

public IActionResult Get()
{
    return Json(model, new JsonSerializerOptions
    {
        WriteIndented = true,
    });
}

Přidání podpory formátu ZALOŽENÉho na JSNewtonsoft.Json

Výchozí JSformátovací moduly ON jsou založeny na System.Text.Json. Newtonsoft.Json Podpora pro založené formátování a funkce je k dispozici instalací Microsoft.AspNetCore.Mvc.NewtonsoftJson balíčku NuGet a jeho konfigurací v Startup.ConfigureServices.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers()
        .AddNewtonsoftJson();
}

V předchozím kódu volání AddNewtonsoftJson konfiguruje následující funkce webového rozhraní API, MVC a Razor Pages, které se mají použít Newtonsoft.Json:

Některé funkce nemusí dobře fungovat s formátovacími System.Text.Jsonmoduly založenými na nich a vyžadují odkaz na Newtonsoft.Jsonformátovací nástroje. Pokračujte v používání Newtonsoft.Jsonformátovacích metod založených na aplikaci:

  • Používá Newtonsoft.Json atributy. Například [JsonProperty] nebo [JsonIgnore].
  • Přizpůsobí nastavení serializace.
  • Spoléhá na funkce, které Newtonsoft.Json poskytuje.

Funkce pro formátovací moduly založené na Newtonsoft.Jsontechnologii lze nakonfigurovat pomocí Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings:

services.AddControllers().AddNewtonsoftJson(options =>
{
    // Use the default property (Pascal) casing
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();

    // Configure a custom converter
    options.SerializerSettings.Converters.Add(new MyCustomJsonConverter());
});

Možnosti serializace výstupu, na základě akce, lze nakonfigurovat pomocí JsonResult. Příklad:

public IActionResult Get()
{
    return Json(model, new JsonSerializerSettings
    {
        Formatting = Formatting.Indented,
    });
}

Zadání formátu

Chcete-li omezit formáty odpovědí, použijte [Produces] filtr. Podobně jako u většiny filtrů[Produces] je možné použít akce, kontroleru nebo globálního oboru:

[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class WeatherForecastController : ControllerBase
{

Předchozí [Produces] filtr:

  • Vynutí všechny akce v kontroleru tak, aby vracely JSodezvy na formátované on-formatted pro objekty POCO (Plain Old CLR Objects) nebo ObjectResult jeho odvozené typy.
  • Pokud jsou nakonfigurované jiné formátovací moduly a klient určuje jiný formát, JSvrátí se funkce ON.

Další informace najdete v tématu Filtry.

Speciální formátovací moduly pro velká písmena

Některé speciální případy se implementují pomocí integrovaných formátovacích metod. Ve výchozím nastavení string jsou návratové typy formátované jako text/prostý text (text/html , pokud se požaduje prostřednictvím hlavičky Accept ). Toto chování lze odstranit odebráním souboru StringOutputFormatter. Formátovací moduly jsou v ConfigureServices metodě odebrány. Akce, které mají návratový typ 204 No Content objektu modelu při vrácení null. Toto chování lze odstranit odebráním souboru HttpNoContentOutputFormatter. Následující kód odebere znak a StringOutputFormatterHttpNoContentOutputFormatter.

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        // requires using Microsoft.AspNetCore.Mvc.Formatters;
        options.OutputFormatters.RemoveType<StringOutputFormatter>();
        options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
    });
}

StringOutputFormatterBez integrovaného JSformátovače string ON vrací typy. Pokud je integrovaný JSformátovací modul ON odebrán a je k dispozici formátovací modul XML, formátovací modul string XML vrátí typy. string V opačném případě vrátí návratové 406 Not Acceptabletypy .

Bez objektu HttpNoContentOutputFormatternull jsou formátovány pomocí konfigurovaného formátovače. Příklad:

  • Formátovací JSmodul ON vrátí odpověď s textem null.
  • Formátovací modul XML vrátí prázdný element XML se sadou atributů xsi:nil="true" .

Mapování adres URL formátu odpovědi

Klienti můžou v rámci adresy URL požadovat určitý formát, například:

  • V řetězci dotazu nebo části cesty.
  • Pomocí přípony souboru specifického pro konkrétní formát, například .xml nebo .json.

Mapování z cesty požadavku by mělo být zadané ve směrování, které rozhraní API používá. Příklad:

[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class ProductsController : ControllerBase
{
    [HttpGet("{id}.{format?}")]
    public Product Get(int id)
    {

Předchozí trasa umožňuje zadat požadovaný formát jako volitelnou příponu souboru. Atribut [FormatFilter] kontroluje existenci hodnoty formátu v RouteData řetězci a mapuje formát odpovědi na příslušný formátovací modul při vytvoření odpovědi.

Postup Formátovací modul
/api/products/5 Výchozí výstupní formátovací modul
/api/products/5.json Formátovací JSmodul ON (pokud je nakonfigurovaný)
/api/products/5.xml Formátovací modul XML (pokud je nakonfigurovaný)

ASP.NET Core MVC podporuje formátování dat odpovědi pomocí zadaných formátů nebo v reakci na požadavek klienta.

Výsledky akce specifické pro konkrétní formát

Některé typy výsledků akce jsou specifické pro určitý formát, například JsonResult a ContentResult. Akce můžou vracet výsledky, které vždy používají zadaný formát a ignorují požadavek klienta na jiný formát. Například vrácení JsonResult vrátí data JSve formátu ON a vrácení vrátí ContentResult řetězcová data ve formátu prostého textu.

Akce není nutná k vrácení žádného konkrétního typu. ASP.NET Core podporuje libovolnou vrácenou hodnotu objektu. Výsledky z akcí, které vracejí objekty, které nejsou IActionResult typy, jsou serializovány pomocí příslušné IOutputFormatter implementace. Další informace najdete v tématu Návratové typy akcí kontroleru ve webovém rozhraní API ASP.NET Core.

Ve výchozím nastavení integrovaná pomocná metoda ControllerBase.Ok vrací JSon-formatted data:

[HttpGet]
public IActionResult Get()
    => Ok(_todoItemStore.GetList());

Vzorový kód vrátí seznam položek úkolů. Pomocí vývojářských nástrojů prohlížeče F12 nebo http-repl s předchozím kódem se zobrazí:

  • Hlavička odpovědi obsahující typ obsahu:application/json; charset=utf-8.
  • Hlavičky požadavku. Například Accept záhlaví. Hlavička Accept je ignorována předchozím kódem.

Pokud chcete vrátit data ve formátu prostého textu, použijte ContentResult a pomocné rutiny Content :

[HttpGet("Version")]
public ContentResult GetVersion()
    => Content("v1.0.0");

V předchozím kódu je text/plainvrácena Content-Type .

Pro akce s více návratovými typy, vraťte IActionResult. Například při vracení různých stavových kódů HTTP na základě výsledku operace.

Vyjednávání obsahu

Vyjednávání obsahu nastane, když klient určuje hlavičku Accept. Výchozí formát používaný ASP.NET Core je JSzapnutý. Vyjednávání obsahu je:

  • Implementoval .ObjectResult
  • Integrované do výsledků akcí specifických pro stavový kód vrácených z pomocných metod. Pomocné metody výsledků akce jsou založeny na ObjectResult.

Při vrácení typu modelu je ObjectResultnávratový typ .

Následující metoda akce používá OkNotFound pomocné metody:

[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
    var todo = _todoItemStore.GetById(id);

    if (todo is null)
    {
        return NotFound();
    }

    return Ok(todo);
}

Ve výchozím nastavení ASP.NET Core podporuje následující typy médií:

  • application/json
  • text/json
  • text/plain

Nástroje, jako je Fiddler nebo http-repl , můžou nastavit hlavičku Accept požadavku tak, aby určila návratový formát. Pokud hlavička Accept obsahuje typ, který server podporuje, vrátí se tento typ. V další části se dozvíte, jak přidat další formátování.

Akce kontroleru můžou vracet objekty POCOs (prosté staré objekty CLR). Při vrácení poco modul runtime automaticky vytvoří ObjectResult objekt, který objekt zabalí. Klient získá formátovaný serializovaný objekt. Pokud je nullvrácen objekt , 204 No Content vrátí se odpověď.

Následující příklad vrátí typ objektu:

[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
    => _todoItemStore.GetById(id);

V předchozím kódu vrátí požadavek na platnou 200 OK položku úkolu odpověď. Požadavek na neplatnou položku úkolu vrátí 204 No Content odpověď.

Hlavička Accept

Vyjednávání obsahu probíhá, když Accept se v požadavku zobrazí záhlaví. Pokud požadavek obsahuje hlavičku accept, ASP.NET Core:

  • Vytvoří výčet typů médií v hlavičce accept v pořadí předvoleb.
  • Pokusí se najít formátovací modul, který může vytvořit odpověď v jednom ze zadaných formátů.

Pokud se nenajde žádný formátovací modul, který by mohl vyhovět požadavku klienta, ASP.NET Core:

  • Vrátí 406 Not Acceptable hodnotu, je-li MvcOptions.ReturnHttpNotAcceptable nastavena na truehodnotu , nebo -
  • Pokusí se najít první formátovací modul, který může vytvořit odpověď.

Pokud není pro požadovaný formát nakonfigurovaný žádný formát, použije se první formátovací modul, který může formátovat objekt. Pokud se v požadavku nezobrazí žádná Accept hlavička:

  • První formátovací modul, který dokáže zpracovat objekt, se používá k serializaci odpovědi.
  • Neprobíhá žádné vyjednávání. Server určuje, jaký formát se má vrátit.

Pokud hlavička Accept obsahuje */*, je hlavička ignorována, pokud RespectBrowserAcceptHeader není nastavena na hodnotu true on MvcOptions.

Prohlížeče a vyjednávání obsahu

Na rozdíl od typických klientů rozhraní API poskytují Accept webové prohlížeče hlavičky. Webové prohlížeče určují mnoho formátů, včetně zástupných znaků. Když rozhraní ve výchozím nastavení zjistí, že požadavek pochází z prohlížeče:

  • Záhlaví Accept se ignoruje.
  • Obsah se vrátí v JSZAPNUTO, pokud není nakonfigurovaný jinak.

Tento přístup poskytuje konzistentnější prostředí napříč prohlížeči při využívání rozhraní API.

Pokud chcete nakonfigurovat aplikaci tak, aby respektovala hlavičky přijetí prohlížeče, nastavte RespectBrowserAcceptHeader vlastnost na true:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    options.RespectBrowserAcceptHeader = true;
});

Konfigurace formátovacích souborů

Aplikace, které potřebují podporovat další formáty, můžou přidat příslušné balíčky NuGet a nakonfigurovat podporu. Existují samostatné formátovací moduly pro vstup a výstup. Vstupní formátovací moduly používají vazby modelu. Výstupní formátovací moduly se používají k formátování odpovědí. Informace o vytvoření vlastního formátovače naleznete v tématu Vlastní formátovací moduly.

Přidání podpory formátu XML

Konfigurace formátovacích souborů XML implementovaných pomocí XmlSerializervolání AddXmlSerializerFormatters:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddXmlSerializerFormatters();

Při použití předchozího kódu vrátí metody kontroleru odpovídající formát na základě hlavičky Accept požadavku.

Konfigurace System.Text.Jsonformátovacích souborů založených na

Ke konfiguraci funkcí pro System.Text.Jsonformátovací moduly Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptionszaložené na jazyce . Následující zvýrazněný kód místo výchozího formátování camelCase konfiguruje formátování PascalCase:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.PropertyNamingPolicy = null;
    });

Chcete-li konfigurovat možnosti serializace výstupu pro konkrétní akce, použijte JsonResult. Příklad:

[HttpGet]
public IActionResult Get() 
    => new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerOptions { PropertyNamingPolicy = null });

JSPřidání Newtonsoft.Jsonpodpory formátu ON

Výchozí JSformátovací moduly ON používají System.Text.Json. Pokud chcete použít Newtonsoft.Jsonformátovací moduly založené na základech, nainstalujte Microsoft.AspNetCore.Mvc.NewtonsoftJson balíček NuGet a nakonfigurujte ho v Program.cs:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson();

V předchozím kódu volání AddNewtonsoftJson konfiguruje následující funkce webového rozhraní API, MVC a Razor Pages, které se mají použít Newtonsoft.Json:

Některé funkce nemusí dobře fungovat s formátovacími System.Text.Jsonmoduly založenými na nich a vyžadují odkaz na Newtonsoft.Jsonformátovací nástroje. Pokračujte v používání Newtonsoft.Jsonformátovacích metod založených na aplikaci:

  • Používá Newtonsoft.Json atributy. Například [JsonProperty] nebo [JsonIgnore].
  • Přizpůsobí nastavení serializace.
  • Spoléhá na funkce, které Newtonsoft.Json poskytuje.

Ke konfiguraci funkcí pro Newtonsoft.Jsonformátovací moduly SerializerSettingszaložené na :

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    });

Chcete-li konfigurovat možnosti serializace výstupu pro konkrétní akce, použijte JsonResult. Příklad:

[HttpGet]
public IActionResult GetNewtonsoftJson()
    => new JsonResult(
        _todoItemStore.GetList(),
        new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });

Formátování ProblemDetails a ValidationProblemDetails odpovědi

Následující volání metody ControllerBase.Problem akce k vytvoření ProblemDetails odpovědi:

[HttpGet("Error")]
public IActionResult GetError()
    => Problem("Something went wrong.");

ProblemDetails Odpověď je vždy camelCase, i když aplikace nastaví formát na PascalCase. ProblemDetails se řídí dokumentem RFC 7807, který určuje malá písmena.

[ApiController] Když se atribut použije na třídu kontroleru, řadič vytvoří ValidationProblemDetails odpověď, když ověření modelu selže. Tato odpověď obsahuje slovník, který používá názvy vlastností modelu jako chybové klíče beze změny. Následující model například obsahuje jednu vlastnost, která vyžaduje ověření:

public class SampleModel
{
    [Range(1, 10)]
    public int Value { get; set; }
}

Ve výchozím nastavení odpověď vrácená, když Value je vlastnost neplatná, ValidationProblemDetails používá kód chyby Value, jak je znázorněno v následujícím příkladu:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-00000000000000000000000000000000-000000000000000-00",
  "errors": {
    "Value": [
      "The field Value must be between 1 and 10."
    ]
  }
}

Chcete-li formátovat názvy vlastností používané jako chybové klíče, přidejte do kolekce implementaci IMetadataDetailsProviderMvcOptions.ModelMetadataDetailsProviders . Následující příklad přidá implementaci založenou System.Text.Jsonna -, SystemTextJsonValidationMetadataProviderkterá ve výchozím nastavení formátuje názvy vlastností jako camelCase:

builder.Services.AddControllers();

builder.Services.Configure<MvcOptions>(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new SystemTextJsonValidationMetadataProvider());
});

SystemTextJsonValidationMetadataProvider také přijímá implementaci JsonNamingPolicy v jeho konstruktoru, který určuje vlastní zásady pojmenování pro formátování názvů vlastností.

Pokud chcete nastavit vlastní název vlastnosti v rámci modelu, použijte atribut [JsonPropertyName] pro vlastnost:

public class SampleModel
{
    [Range(1, 10)]
    [JsonPropertyName("sampleValue")]
    public int Value { get; set; }
}

Odpověď ValidationProblemDetails vrácená pro předchozí model, pokud Value je vlastnost neplatná, používá chybový klíč sampleValue, jak je znázorněno v následujícím příkladu:

{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-00000000000000000000000000000000-000000000000000-00",
  "errors": {
    "sampleValue": [
      "The field Value must be between 1 and 10."
    ]
  }
}

Chcete-li naformátovat ValidationProblemDetails odpověď pomocí Newtonsoft.Jsonpříkazu , použijte NewtonsoftJsonValidationMetadataProvider:

builder.Services.AddControllers()
    .AddNewtonsoftJson();

builder.Services.Configure<MvcOptions>(options =>
{
    options.ModelMetadataDetailsProviders.Add(
        new NewtonsoftJsonValidationMetadataProvider());
});

Ve výchozím nastavení NewtonsoftJsonValidationMetadataProvider formátuje názvy vlastností jako camelCase. NewtonsoftJsonValidationMetadataProvider také přijímá implementaci NamingPolicy v jeho konstruktoru, který určuje vlastní zásady pojmenování pro formátování názvů vlastností. Pokud chcete nastavit vlastní název vlastnosti v modelu, použijte [JsonProperty] atribut.

Zadání formátu

Chcete-li omezit formáty odpovědí, použijte [Produces] filtr. Podobně jako u většiny filtrů[Produces] je možné použít akce, kontroleru nebo globálního oboru:

[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase

Předchozí [Produces] filtr:

  • Vynutí všechny akce v kontroleru tak, aby vracely JSodezvy na formátované on-formatted pro objekty POCO (Plain Old CLR Objects) nebo ObjectResult jeho odvozené typy.
  • Vrácení JSodpovědí ve formátu ON, i když jsou nakonfigurované jiné formátovací moduly a klient určuje jiný formát.

Další informace najdete v tématu Filtry.

Speciální formátovací moduly pro velká písmena

Některé speciální případy se implementují pomocí integrovaných formátovacích metod. Ve výchozím nastavení string jsou návratové typy formátované jako text/prostý text (text/html , pokud se požaduje prostřednictvím hlavičky Accept ). Toto chování lze odstranit odebráním souboru StringOutputFormatter. Formátovací moduly jsou odebrány v Program.cs. Akce, které mají návratový typ 204 No Content objektu modelu při vrácení null. Toto chování lze odstranit odebráním souboru HttpNoContentOutputFormatter. Následující kód odebere znak a StringOutputFormatterHttpNoContentOutputFormatter.

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers(options =>
{
    // using Microsoft.AspNetCore.Mvc.Formatters;
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
    options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});

StringOutputFormatterBez integrovaného JSformátovače string ON vrací typy. Pokud je integrovaný JSformátovací modul ON odebrán a je k dispozici formátovací modul XML, formátovací modul string XML vrátí typy. string V opačném případě vrátí návratové 406 Not Acceptabletypy .

Bez objektu HttpNoContentOutputFormatternull jsou formátovány pomocí konfigurovaného formátovače. Příklad:

  • Formátovací JSmodul ON vrátí odpověď s textem null.
  • Formátovací modul XML vrátí prázdný element XML se sadou atributů xsi:nil="true" .

Mapování adres URL formátu odpovědi

Klienti můžou v rámci adresy URL požadovat určitý formát, například:

  • V řetězci dotazu nebo části cesty.
  • Pomocí přípony souboru specifického pro konkrétní formát, například .xml nebo .json.

Mapování z cesty požadavku by mělo být zadané ve směrování, které rozhraní API používá. Příklad:

[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
    private readonly TodoItemStore _todoItemStore;

    public TodoItemsController(TodoItemStore todoItemStore)
        => _todoItemStore = todoItemStore;

    [HttpGet("{id:long}.{format?}")]
    public TodoItem? GetById(long id)
        => _todoItemStore.GetById(id);

Předchozí trasa umožňuje zadat požadovaný formát pomocí volitelné přípony souboru. Atribut [FormatFilter] kontroluje existenci hodnoty formátu v RouteData řetězci a mapuje formát odpovědi na příslušný formátovací modul při vytvoření odpovědi.

Postup Formátovací modul
/api/todoitems/5 Výchozí výstupní formátovací modul
/api/todoitems/5.json Formátovací JSmodul ON (pokud je nakonfigurovaný)
/api/todoitems/5.xml Formátovací modul XML (pokud je nakonfigurovaný)

Polymorfní deserializace

Integrované funkce poskytují omezený rozsah polymorfní serializace, ale vůbec žádná podpora deserializace. Deserializace vyžaduje vlastní převaděč. Úplný vzorek polymorfní deserializace najdete v tématu Polymorfní deserializace.

Další materiály