Megosztás a következőn keresztül:


Válaszadatok formázása a ASP.NET Core Web API-ban

ASP.NET Core MVC támogatja a válaszadatok formázását megadott formátumok használatával vagy az ügyfél kérésére válaszul.

Formátumspecifikus művelet eredményei

Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek olyan eredményeket adhatnak vissza, amelyek mindig egy megadott formátumot használnak, figyelmen kívül hagyva az ügyfél más formátumra vonatkozó kérését. A visszatérési JsonResult érték például JSON formátumú adatokat ad vissza, a visszaadott ContentResult adatok pedig egyszerű szöveges formátumú sztringadatokat ad vissza.

Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.

A beépített segédmetódus ControllerBase.Ok alapértelmezés szerint JSON formátumú adatokat ad vissza:

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

A mintakód a teendők listáját adja vissza. Az F12 böngésző fejlesztői eszközeinek vagy a http-repl előző kódjával történő használata megjeleníti:

  • A tartalomtípust tartalmazó válaszfejléc:application/json; charset=utf-8
  • A kérelem fejlécei. Például a Accept fejlécet. A Accept fejlécet az előző kód figyelmen kívül hagyja.

Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.

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

Az előző kódrészletben a Content-Type visszatérített érték a text/plain.

Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Ha például a művelet eredménye alapján különböző HTTP-állapotkódokat ad vissza.

Tartalom egyeztetése

A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:

  • Implementálva: ObjectResult.
  • Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a ObjectResult-on alapulnak.

Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .

A következő műveletmetódus a segédmetódusokat OkNotFound használja:

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

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

    return Ok(todo);
}

Alapértelmezés szerint a ASP.NET Core a következő médiatípusokat támogatja:

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

Az olyan eszközök, mint a Fiddler vagy a curl, beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.

A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.

Az alábbi példa egy objektumtípust ad vissza:

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

Az előző kódban egy érvényes teendőelemre vonatkozó kérés válaszként 200 OK ad vissza. Egy érvénytelen teendőelemre vonatkozó kérés 204 No Content választ ad vissza.

Az Accept fejléc

A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:

  • Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
  • Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.

Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:

Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:

  • Az objektumot kezelő első formázó szerializálja a választ.
  • Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.

Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.

Böngészők és tartalom egyeztetése

A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:

  • A Accept fejléc figyelmen kívül lesz hagyva.
  • A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.

Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.

Ha úgy szeretne konfigurálni egy alkalmazást, hogy megfeleljen a böngészőben az elfogadási fejléceket, állítsa a következőre a RespectBrowserAcceptHeader tulajdonságot: true.

var builder = WebApplication.CreateBuilder(args);

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

Formázók konfigurálása

Az extra formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.

XML-formátum támogatása

Az XmlSerializer által implementált XML-formázók konfigurálásához hívja meg a AddXmlSerializerFormatters:

var builder = WebApplication.CreateBuilder(args);

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

Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.

System.Text.Json alapú formázók konfigurálása

A(z) System.Text.Json alapú formázók funkcióinak konfigurálásához használja a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Az alábbi kiemelt kód a PascalCase formázást konfigurálja az alapértelmezett camelCase formázás helyett:

var builder = WebApplication.CreateBuilder(args);

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

A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.

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

A ProblemDetails válasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be. ProblemDetails az RFC 7807-et követi, amely kisbetűt ad meg.

A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:

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

Newtonsoft.Json-alapú JSON formátum támogatásának hozzáadása

Az alapértelmezett JSON-formázók a következőt használják System.Text.Json: . A(z) Newtonsoft.Json alapú formázók használatához telepítse a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomagot, és konfigurálja a Program.cs.

var builder = WebApplication.CreateBuilder(args);

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

Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:

Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:

  • A Newtonsoft.Json attribútumokat használja. Például, [JsonProperty] vagy [JsonIgnore].
  • Testre szabja a szerializálási beállításokat.
  • A szolgáltatásokra Newtonsoft.Json támaszkodik.

A Newtonsoft.Json alapú formatter funkcióinak konfigurálásához használja a SerializerSettings elemet.

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

A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:

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

Formátum megadása

A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:

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

Az előző [Produces] szűrő:

  • Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
  • JSON-formátumú válaszokat ad vissza akkor is, ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg.

További információ: Szűrők.

Speciális esetformázók

Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók törlődnek a fájlból Program.cs. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.

var builder = WebApplication.CreateBuilder(args);

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

A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.

HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:

  • A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő null: .
  • Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel xsi:nil="true" .

Válaszformátum URL-leképezései

Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:

  • A lekérdezési sztringben vagy az elérési út egy részében.
  • Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.

A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:

[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);

Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztés használatával. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.

Route Formatter
/api/todoitems/5 Az alapértelmezett kimeneti formátum
/api/todoitems/5.json A JSON-formázó (ha konfigurálva van)
/api/todoitems/5.xml Az XML-formázó (ha konfigurálva van)

Polimorf deszerializálás

A beépített funkciók a polimorf szerializálás korlátozott körét biztosítják, de egyáltalán nem támogatják a deszerializálást. A deszerializáláshoz egyéni konverter szükséges. A polimorf deszerializálás teljes mintájáért lásd a polimorf deszerializálást .

További erőforrások

ASP.NET Core MVC támogatja a válaszadatok formázását. A válaszadatok adott formátumokkal vagy az ügyfél által kért formátumra válaszul formázhatók.

Mintakód megtekintése vagy letöltése (hogyan töltsd le)

Formátumspecifikus művelet eredményei

Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek az ügyfélbeállításoktól függetlenül egy adott formátumban formázott eredményeket adhatnak vissza. A visszatérés például JSON-formátumú adatokat ad vissza JsonResult . A ContentResult vagy egy sztring visszaadása egyszerű szöveges formátumú sztringadatokat eredményez.

Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.

A beépített segédmetódus Ok JSON formátumú adatokat ad vissza:

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

A mintaletöltés visszaadja a szerzők listáját. Az F12 böngésző fejlesztői eszközei vagy a http-repl használata az előző kóddal:

  • Megjelenik a tartalomtípustapplication/json; charset=utf-8 tartalmazó válaszfejléc.
  • Megjelennek a kérelemfejlécek. Például a Accept fejlécet. A Accept fejlécet az előző kód figyelmen kívül hagyja.

Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.

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

Az előző kódrészletben a Content-Type visszatérített érték a text/plain. Sztring visszaadása Content-Typetext/plain:

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

Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Például különböző HTTP-állapotkódokat ad vissza az elvégzett műveletek eredménye alapján.

Tartalom egyeztetése

A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:

  • Implementálva: ObjectResult.
  • Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a ObjectResult-on alapulnak.

Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .

A következő műveletmetódus a segédmetódusokat OkNotFound használja:

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

Alapértelmezés szerint az ASP.NET Core támogatja a application/json, text/json és text/plain médiatípusokat. Az olyan eszközök, mint a Fiddler vagy a http-repl , beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.

A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.

Objektumtípus visszaadása:

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

Az előző kódban egy érvényes szerzői aliasra vonatkozó kérés választ ad 200 OK vissza a szerző adataival. Egy érvénytelen aliasra vonatkozó kérés visszaad egy 204 No Content választ.

Az Accept fejléc

A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:

  • Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
  • Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.

Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:

Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:

  • Az objektumot kezelő első formázó szerializálja a választ.
  • Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.

Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.

Böngészők és tartalom egyeztetése

A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:

  • A Accept fejléc figyelmen kívül lesz hagyva.
  • A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.

Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.

Ha úgy szeretné konfigurálni az alkalmazást, hogy tiszteletben tartsa a böngésző "accept" fejléceit, állítsa be a RespectBrowserAcceptHeader értékét true-re.

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

Formázók konfigurálása

A további formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.

XML-formátum támogatása

Az XML-formázók, amelyeket a XmlSerializer használatával implementáltak, a AddXmlSerializerFormatters meghívásával vannak konfigurálva.

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

Az előző kód szerializálja az eredményeket a következő használatával XmlSerializer: .

Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.

Bázis alapú formázók konfigurálása System.Text.Json

A System.Text.Json alapú formázók funkciói a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions használatával konfigurálhatók. Az alapértelmezett formázási típus a camelCase. A következő kiemelt kód a PascalCase-formázást alkalmazza:

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

A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.

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

Az előző kóddal:

  • https://localhost:5001/WeatherForecast/temperature PascalCase értéket ad vissza.
  • https://localhost:5001/WeatherForecast/error visszaad camelCase-t. A hibaválasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be. ProblemDetails az RFC 7807-et követi, amely a kisbetűk használatát írja elő.

A következő kód beállítja a PascalCaset, és hozzáad egy egyéni konvertert:

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

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

Műveletenként konfigurálhatók a kimeneti szerializálási beállítások JsonResult segítségével. Például:

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

Newtonsoft.Json-alapú JSON-formátum támogatásának hozzáadása

Az alapértelmezett JSON-formázók System.Text.Json alapulnak. Newtonsoft.Json Az alapú formázók és funkciók támogatása elérhető a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomag telepítésével és konfigurálásával Startup.ConfigureServices.

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

Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:

Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:

  • A Newtonsoft.Json attribútumokat használja. Például, [JsonProperty] vagy [JsonIgnore].
  • Testre szabja a szerializálási beállításokat.
  • A szolgáltatásokra Newtonsoft.Json támaszkodik.

A Newtonsoft.Json alapú formázók funkciói a Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings használatával konfigurálhatók.

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

Műveletenként konfigurálhatók a kimeneti szerializálási beállítások JsonResult segítségével. Például:

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

Formátum megadása

A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:

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

Az előző [Produces] szűrő:

  • Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
  • Ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg, a JSON vissza lesz adva.

További információ: Szűrők.

Speciális esetformázók

Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók a ConfigureServices metódusban eltávolításra kerülnek. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.

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

A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.

HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:

  • A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő null: .
  • Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel xsi:nil="true" .

Válaszformátum URL-leképezései

Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:

  • A lekérdezési sztringben vagy az elérési út egy részében.
  • Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.

A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:

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

Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztésként. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.

Route Formatter
/api/products/5 Az alapértelmezett kimeneti formátum
/api/products/5.json A JSON-formázó (ha konfigurálva van)
/api/products/5.xml Az XML-formázó (ha konfigurálva van)

ASP.NET Core MVC támogatja a válaszadatok formázását megadott formátumok használatával vagy az ügyfél kérésére válaszul.

Formátumspecifikus művelet eredményei

Egyes műveleteredmény-típusok egy adott formátumra vonatkoznak, például JsonResult és ContentResult. A műveletek olyan eredményeket adhatnak vissza, amelyek mindig egy megadott formátumot használnak, figyelmen kívül hagyva az ügyfél más formátumra vonatkozó kérését. A visszatérési JsonResult érték például JSON formátumú adatokat ad vissza, a visszaadott ContentResult adatok pedig egyszerű szöveges formátumú sztringadatokat ad vissza.

Egy adott típus visszaadásához nincs szükség műveletre. ASP.NET Core támogat bármilyen objektumszintű visszatérési értéket. A nem IActionResult típusok objektumait visszaadó műveletek eredményei a megfelelő IOutputFormatter implementációval szerializálva lesznek. További információ: Vezérlőművelet visszatérési típusai a ASP.NET Core webes API-ban.

A beépített segédmetódus ControllerBase.Ok alapértelmezés szerint JSON formátumú adatokat ad vissza:

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

A mintakód a teendők listáját adja vissza. Az F12 böngésző fejlesztői eszközeinek vagy a http-repl előző kódjával történő használata megjeleníti:

  • A tartalomtípust tartalmazó válaszfejléc:application/json; charset=utf-8
  • A kérelem fejlécei. Például a Accept fejlécet. A Accept fejlécet az előző kód figyelmen kívül hagyja.

Egyszerű szöveges formátumú adatok visszaadásához használja a ContentResult és a Content segédet.

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

Az előző kódrészletben a Content-Type visszatérített érték a text/plain.

Több visszatérési típussal rendelkező műveletek esetén adja vissza a következőt IActionResult: . Ha például a művelet eredménye alapján különböző HTTP-állapotkódokat ad vissza.

Tartalom egyeztetése

A tartalom egyeztetése akkor történik, ha az ügyfél egy Accept fejlécet ad meg. A ASP.NET Core által használt alapértelmezett formátum a JSON. A tartalom egyeztetése a következő:

  • Implementálva: ObjectResult.
  • Beépített az állapotkód-specifikus művelet eredményeibe, amelyeket a segítő metódusok adnak vissza. A műveleti eredmények segédmetódusai a ObjectResult-on alapulnak.

Modelltípus visszaadásakor a visszatérési típus a következő ObjectResult: .

A következő műveletmetódus a segédmetódusokat OkNotFound használja:

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

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

    return Ok(todo);
}

Alapértelmezés szerint a ASP.NET Core a következő médiatípusokat támogatja:

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

Az olyan eszközök, mint a Fiddler vagy a http-repl , beállíthatják a Accept kérés fejlécét a visszatérési formátum megadására. Ha a Accept fejléc olyan típust tartalmaz, amelyet a kiszolgáló támogat, a rendszer ezt a típust adja vissza. A következő szakasz bemutatja, hogyan adhat hozzá további formázókat.

A vezérlőműveletek POCO-kat (egyszerű régi CLR-objektumokat) adhatnak vissza. POCO visszaadásakor a futtatókörnyezet automatikusan létrehoz egy ObjectResult-t, amely becsomagolja az objektumot. Az ügyfél megkapja a formázott szerializált objektumot. Ha a visszaadott objektum az null, a 204 No Content rendszer választ ad vissza.

Az alábbi példa egy objektumtípust ad vissza:

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

Az előző kódban egy érvényes teendőelemre vonatkozó kérés válaszként 200 OK ad vissza. Egy érvénytelen teendőelemre vonatkozó kérés 204 No Content választ ad vissza.

Az Accept fejléc

A tartalom egyeztetésére akkor kerül sor, amikor egy Accept fejléc jelenik meg a kérelemben. Ha egy kérelem elfogadó fejlécet tartalmaz, ASP.NET Core:

  • Az elfogadás fejlécében szereplő médiatípusok számbavétele beállítási sorrendben.
  • Olyan formázót próbál megkeresni, amely a megadott formátumok egyikében tud választ adni.

Ha nem található olyan formázó, amely megfelel az ügyfél kérésének, ASP.NET Core:

Ha nincs formázó a kért formátumhoz konfigurálva, a rendszer az objektumot formázó első formázót használja. Ha a kérés nem tartalmaz Accept fejlécet:

  • Az objektumot kezelő első formázó szerializálja a választ.
  • Nincs tárgyalás. A kiszolgáló határozza meg, hogy milyen formátumot kell visszaadni.

Ha az Elfogadás fejléc tartalmazza */*, a fejléc figyelmen kívül lesz hagyva, kivéve, ha RespectBrowserAcceptHeader igaz értékre MvcOptionsvan állítva.

Böngészők és tartalom egyeztetése

A tipikus API-ügyfelektől eltérően a webböngészők fejléceket biztosítanak Accept . A webböngészők számos formátumot határoznak meg, beleértve a helyettesítő karaktereket is. Alapértelmezés szerint, ha a keretrendszer azt észleli, hogy a kérés böngészőből érkezik:

  • A Accept fejléc figyelmen kívül lesz hagyva.
  • A tartalom JSON-ban lesz visszaadva, hacsak nincs más konfigurálva.

Ez a megközelítés konzisztensebb élményt nyújt a böngészőkben az API-k használata során.

Ha úgy szeretne konfigurálni egy alkalmazást, hogy megfeleljen a böngészőben az elfogadási fejléceket, állítsa a következőre a RespectBrowserAcceptHeader tulajdonságot: true.

var builder = WebApplication.CreateBuilder(args);

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

Formázók konfigurálása

Az extra formátumok támogatásához szükséges alkalmazások hozzáadhatják a megfelelő NuGet-csomagokat, és konfigurálhatják a támogatást. A bemenethez és a kimenethez külön formátumok tartoznak. A bemeneti formázókat a modellkötés használja. A kimeneti formázók a válaszok formázására szolgálnak. Az egyéni formázók létrehozásáról további információt az Egyéni formázók című témakörben talál.

XML-formátum támogatása

Az XmlSerializer által implementált XML-formázók konfigurálásához hívja meg a AddXmlSerializerFormatters:

var builder = WebApplication.CreateBuilder(args);

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

Az előző kód használatakor a vezérlő metódusai a kérés fejléce Accept alapján visszaadják a megfelelő formátumot.

System.Text.Json alapú formázók konfigurálása

A(z) System.Text.Json alapú formázók funkcióinak konfigurálásához használja a Microsoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions. Az alábbi kiemelt kód a PascalCase formázást konfigurálja az alapértelmezett camelCase formázás helyett:

var builder = WebApplication.CreateBuilder(args);

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

A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:

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

Newtonsoft.Json-alapú JSON formátum támogatásának hozzáadása

Az alapértelmezett JSON-formázók a következőt használják System.Text.Json: . A(z) Newtonsoft.Json alapú formázók használatához telepítse a Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet-csomagot, és konfigurálja a Program.cs.

var builder = WebApplication.CreateBuilder(args);

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

Az előző kódban a AddNewtonsoftJson hívás konfigurálja a következő Web API-, MVC- és Razor Pages-funkciók használatát Newtonsoft.Json:

Előfordulhat, hogy egyes funkciók nem működnek megfelelően a System.Text.Json alapú formázókkal, és hivatkozni kell a Newtonsoft.Json alapú formázókra. Folytassa a Newtonsoft.Json alapú formázók használatát, amikor az alkalmazás:

  • A Newtonsoft.Json attribútumokat használja. Például, [JsonProperty] vagy [JsonIgnore].
  • Testre szabja a szerializálási beállításokat.
  • A szolgáltatásokra Newtonsoft.Json támaszkodik.

A Newtonsoft.Json alapú formatter funkcióinak konfigurálásához használja a SerializerSettings elemet.

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

A kimeneti szerializálási beállítások adott műveletekhez való konfigurálásához használja JsonResulta következőt: . Például:

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

Formázd meg a ProblemDetails és ValidationProblemDetails válaszokat

A következő műveletmetódus meghívja a ControllerBase.Problem függvényt egy ProblemDetails válasz létrehozásához.

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

A ProblemDetails válasz mindig camelCase, még akkor is, ha az alkalmazás PascalCase formátumot állít be. ProblemDetails az RFC 7807-et követi, amely kisbetűt ad meg.

Amikor az [ApiController] attribútumot egy vezérlőosztályra alkalmazza, a vezérlő választ hoz létre ValidationProblemDetails , ha a modell érvényesítése sikertelen. Ez a válasz tartalmaz egy szótárt, amely a modell tulajdonságneveit hibakulcsként használja, változatlanul. A következő modell például egyetlen, érvényesítést igénylő tulajdonságot tartalmaz:

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

A válasz, amelyet ValidationProblemDetails érvénytelen Value tulajdonság esetén alapértelmezés szerint visszaadnak, a Value hibakulcsot használja, ahogyan az a következő példában látható:

{
  "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."
    ]
  }
}

A hibakulcsként használt tulajdonságnevek formázásához adja hozzá a IMetadataDetailsProvider implementációját a MvcOptions.ModelMetadataDetailsProviders gyűjteményhez. Az alábbi példa egy -alapú implementációt System.Text.Jsonad hozzá, SystemTextJsonValidationMetadataProvideramely alapértelmezés szerint camelCaseként formázja a tulajdonságneveket:

builder.Services.AddControllers();

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

SystemTextJsonValidationMetadataProvider Emellett elfogadja a konstruktor implementációját JsonNamingPolicy is, amely egy egyéni elnevezési szabályzatot határoz meg a tulajdonságnevek formázásához.

A modellen belüli tulajdonság egyéni nevének beállításához használja a [JsonPropertyName] attribútumot a tulajdonságon:

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

A ValidationProblemDetails válasz, amelyet az előző modellnél kapunk, ha a Value tulajdonság érvénytelen, a következő hibakulcsot sampleValue használja, amint az a következő példában látható:

{
  "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."
    ]
  }
}

A ValidationProblemDetails válasz formázásához a következő Newtonsoft.Json használja: NewtonsoftJsonValidationMetadataProvider

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

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

Alapértelmezés szerint NewtonsoftJsonValidationMetadataProvider a tulajdonságneveket camelCase formátumban formázta. NewtonsoftJsonValidationMetadataProvider Emellett elfogadja a konstruktor implementációját NamingPolicy is, amely egy egyéni elnevezési szabályzatot határoz meg a tulajdonságnevek formázásához. A modellen belüli tulajdonság egyéni nevének beállításához használja az [JsonProperty] attribútumot.

Formátum megadása

A válaszformátumok korlátozásához alkalmazza a szűrőt [Produces] . A legtöbb szűrő alkalmazható a művelet, a vezérlő vagy a globális hatókör szintjén:

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

Az előző [Produces] szűrő:

  • Kényszeríti a vezérlőn belüli összes műveletet, hogy JSON-formátumú válaszokat ad vissza a POCOS-okra (egyszerű régi CLR-objektumok) vagy ObjectResult annak származtatott típusaira.
  • JSON-formátumú válaszokat ad vissza akkor is, ha más formázók vannak konfigurálva, és az ügyfél más formátumot ad meg.

További információ: Szűrők.

Speciális esetformázók

Néhány speciális eset beépített formázókkal van implementálva. Alapértelmezés szerint a string visszatérési típusok szövegként/egyszerűként vannak formázva (szöveg/html, ha a fejlécen keresztül kérik).Accept Ez a viselkedés törölhető az StringOutputFormatter eltávolításával. A formázók törlődnek a fájlból Program.cs. Azokban az esetekben, amikor a műveletek modellobjektum visszatérési típussal rendelkeznek, 204 No Content adódik vissza, amikor a null a visszatérési érték. Ez a viselkedés törölhető az HttpNoContentOutputFormatter eltávolításával. Az alábbi kód eltávolítja a StringOutputFormatter és HttpNoContentOutputFormatter-t.

var builder = WebApplication.CreateBuilder(args);

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

A StringOutputFormatter hiányában a beépített JSON formázó formázza a string visszatérési típusokat. Ha a beépített JSON-formázó el lett távolítva, és elérhető egy XML-formázó, az XML-formázó formátumok string típusokat ad vissza. Ellenkező esetben a string visszatérési típusok 406 Not Acceptable-t adnak vissza.

HttpNoContentOutputFormatter nélkül a null objektumok a konfigurált formázó használatával vannak formázva. Például:

  • A JSON-formázó egy olyan választ ad vissza, amelynek törzse a következő null: .
  • Az XML-formázó egy üres XML-elemet ad vissza az attribútumkészlettel xsi:nil="true" .

Válaszformátum URL-leképezései

Az ügyfelek az URL-cím részeként kérhetnek egy adott formátumot, például:

  • A lekérdezési sztringben vagy az elérési út egy részében.
  • Formátumspecifikus fájlkiterjesztés, például .xml vagy .jsonhasználatával.

A kérelem elérési útjának leképezését az API által használt útvonalon kell megadni. Például:

[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);

Az előző útvonal lehetővé teszi a kért formátum megadását opcionális fájlkiterjesztés használatával. Az [FormatFilter] attribútum ellenőrzi, hogy létezik-e a formátumérték a RouteData fájlban, és a válaszformátumot a válasz létrehozásakor a megfelelő formázóhoz rendeli.

Route Formatter
/api/todoitems/5 Az alapértelmezett kimeneti formátum
/api/todoitems/5.json A JSON-formázó (ha konfigurálva van)
/api/todoitems/5.xml Az XML-formázó (ha konfigurálva van)

Polimorf deszerializálás

A beépített funkciók a polimorf szerializálás korlátozott körét biztosítják, de egyáltalán nem támogatják a deszerializálást. A deszerializáláshoz egyéni konverter szükséges. A polimorf deszerializálás teljes mintájáért lásd a polimorf deszerializálást .

További erőforrások