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


A Swashbuckle és a ASP.NET Core használatának első lépései

Jegyzet

A Swashbuckle nem érhető el a .NET 9-ben vagy újabb verzióiban. Alternatívaként tekintse meg a Az OpenAPI-támogatás áttekintése az ASP.NET Core API-alkalmazásokbanszakaszt.

A Swashbuckle három fő összetevőből áll:

  • Swashbuckle.AspNetCore.Swagger: Swagger objektummodell és köztes szoftver, amely JSON-végpontként teszi elérhetővé SwaggerDocument objektumokat.

  • Swashbuckle.AspNetCore.SwaggerGen: egy Swagger-generátor, amely közvetlenül az útvonalakból, vezérlőkből és modellekből készít SwaggerDocument objektumokat. Általában a Swagger végpont köztes szoftverrel kombinálva automatikusan elérhetővé teszi a Swagger JSON-t.

  • Swashbuckle.AspNetCore.SwaggerUI: a Swagger felhasználói felületi eszköz beágyazott verziója. A Swagger JSON-t úgy értelmezi, hogy gazdag, testre szabható felületet hozzon létre a webes API funkcióinak leírásához. Beépített tesztkereteket tartalmaz a nyilvános módszerekhez.

Csomag telepítése

A Swashbuckle a következő módokon adható hozzá:

  • A Package Manager konzol ablakából:

    • Tekintse meg Nézet>Egyéb ablakok>Csomagkezelő konzol

    • Lépjen arra a könyvtárra, amelyben a .csproj fájl létezik

    • Hajtsa végre a következő parancsot:

      Install-Package Swashbuckle.AspNetCore -Version 6.6.2
      
  • A NuGet-csomagok kezelése ablakban:

    • Kattintson a jobb gombbal a projektre Megoldáskezelőben>NuGet-csomagok kezelése
    • A csomag forrásának beállítása "nuget.org" értékre
    • Győződjön meg arról, hogy az "Előzetes kiadás befoglalása" lehetőség be van kapcsolva.
    • Írja be a "Swashbuckle.AspNetCore" kifejezést a keresőmezőbe
    • Válassza ki a legújabb "Swashbuckle.AspNetCore" csomagot a Tallózás lapon, majd kattintson a Telepítés gombra.

Swagger köztes szoftver hozzáadása és konfigurálása

Adja hozzá a Swagger-generátort a Program.csszolgáltatásgyűjteményéhez:

builder.Services.AddControllers();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

Az előző példában látható AddEndpointsApiExplorer hívás csak minimális API-khozszükséges. További információért lásd ezt a StackOverflow bejegyzést .

Engedélyezze a köztes szoftvert a létrehozott JSON-dokumentum és a Swagger felhasználói felület kiszolgálásához, szintén a Program.cs:

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

Az előző kód csak akkor adja hozzá a Swagger köztes réteget, ha az aktuális környezet fejlesztési környezetre van beállítva. A UseSwaggerUI metódushívás lehetővé teszi a Swagger felhasználói felületi eszköz beágyazott verzióját.

Indítsa el az alkalmazást, és lépjen a https://localhost:<port>/swagger/v1/swagger.json. A végpontokat leíró létrehozott dokumentum a OpenAPI-specifikációban (openapi.json)látható módon jelenik meg.

A Swagger felhasználói felület megtalálható a https://localhost:<port>/swaggerhelyen. Fedezze fel az API-t a Swagger felhasználói felületén keresztül, és építse be más programokba.

Tipp

A Swagger felhasználói felületének az alkalmazás gyökerénél (https://localhost:<port>/) való kiszolgálásához állítsa a RoutePrefix tulajdonságot üres sztringre:

if (builder.Environment.IsDevelopment())
{
    app.UseSwaggerUI(options => // UseSwaggerUI is called only in Development.
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
        options.RoutePrefix = string.Empty;
    });
}

Ha címtárakat használ IIS-vel vagy fordított proxyval, állítsa a Swagger-végpontot egy relatív elérési útra a ./ előtag használatával. Például ./swagger/v1/swagger.json. A /swagger/v1/swagger.json használatakor az alkalmazás utasítást kap, hogy keresse meg a JSON-fájlt az URL valódi gyökerénél, valamint az útvonalelőtaggal, ha használják. Használjon például https://localhost:<port>/<route_prefix>/swagger/v1/swagger.jsonhttps://localhost:<port>/<virtual_directory>/<route_prefix>/swagger/v1/swagger.jsonhelyett.

Jegyzet

Alapértelmezés szerint a Swashbuckle létrehozza és elérhetővé teszi a Swagger JSON-t a specifikáció 3.0-s verziójában – hivatalos nevén OpenAPI-specifikációban. A visszamenőleges kompatibilitás támogatásához inkább a JSON 2.0-s formátumban való megjelenítését választhatja. Ez a 2.0 formátum olyan integrációk esetében fontos, mint a Microsoft Power Apps és a Microsoft Flow, amelyek jelenleg támogatják az OpenAPI 2.0-s verzióját. A 2.0 formátumra való választáshoz állítsa be a SerializeAsV2 tulajdonságot a Program.cs-ben.

app.UseSwagger(options =>
{
    options.SerializeAsV2 = true;
});

Testreszabás és bővítés

A Swagger lehetővé teszi az objektummodell dokumentálását és a felhasználói felület testreszabását a témának megfelelően.

API-információk és leírás

A AddSwaggerGen metódusnak átadott konfigurációs művelet olyan információkat ad hozzá, mint a szerző, a licenc és a leírás.

A Program.csimportálja a következő névteret a OpenApiInfo osztály használatához:

using Microsoft.OpenApi.Models;

A OpenApiInfo osztály használatával módosítsa a felhasználói felületen megjelenő információkat:

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "ToDo API",
        Description = "An ASP.NET Core Web API for managing ToDo items",
        TermsOfService = new Uri("https://example.com/terms"),
        Contact = new OpenApiContact
        {
            Name = "Example Contact",
            Url = new Uri("https://example.com/contact")
        },
        License = new OpenApiLicense
        {
            Name = "Example License",
            Url = new Uri("https://example.com/license")
        }
    });
});

A Swagger felhasználói felülete megjeleníti a verzió adatait:

Swagger felhasználói felülete verzióinformációkkal: leírás, szerző és licenc.

XML-megjegyzések

Az XML-megjegyzések a következő módszerekkel engedélyezhetők:

  • Kattintson a jobb gombbal a projektre Megoldáskezelő, és válassza a Edit <project_name>.csprojlehetőséget.
  • GenerateDocumentationFile hozzáadása a .csproj fájlhoz:
<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
</PropertyGroup>

Az XML-megjegyzések engedélyezése hibakeresési információkat biztosít a nem dokumentált nyilvános típusok és tagok számára. A nem dokumentált típusokat és tagokat a figyelmeztető üzenet jelzi. Az alábbi üzenet például az 1591-ben megjelenő figyelmeztető kód megsértését jelzi:

warning CS1591: Missing XML comment for publicly visible type or member 'TodoController'

A projektszintű figyelmeztetések mellőzéséhez definiálja a projektfájlban figyelmen kívül hagyandó figyelmeztető kódok pontosvesszővel tagolt listáját. Ha hozzáfűzi a figyelmeztetési kódokat a $(NoWarn);-hoz, akkor a C# alapértelmezett értékei is alkalmazásra kerülnek-ben.

<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

Ha csak bizonyos tagok figyelmeztetéseit szeretné letiltani, a kódot #pragma figyelmeztetési előfeldolgozási irányelvekbe kell belefoglalnia. Ez a módszer olyan kódok esetében hasznos, amelyeket nem szabad az API-dokumentumokon keresztül elérhetővé tenni. Az alábbi példában a CS1591 figyelmeztető kód figyelmen kívül lesz hagyva a teljes TodoContext osztályban. A figyelmeztető kód érvényesítése az osztálydefiníció végén lesz visszaállítva. Adjon meg több figyelmeztető kódot vesszővel tagolt listával.

namespace SwashbuckleSample.Models;

#pragma warning disable CS1591
public class TodoContext : DbContext
{
    public TodoContext(DbContextOptions<TodoContext> options) : base(options) { }

    public DbSet<TodoItem> TodoItems => Set<TodoItem>();
}
#pragma warning restore CS1591

Konfigurálja a Swaggert az előző utasítások alapján létrehozott XML-fájl használatára. Linux vagy más nem Windows operációs rendszerek esetén a fájlnevek és az elérési utak megkülönböztethetik a kis- és nagybetűket. Egy TodoApi.XML fájl például Windows rendszeren érvényes, de nem Ubuntu.

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "ToDo API",
        Description = "An ASP.NET Core Web API for managing ToDo items",
        TermsOfService = new Uri("https://example.com/terms"),
        Contact = new OpenApiContact
        {
            Name = "Example Contact",
            Url = new Uri("https://example.com/contact")
        },
        License = new OpenApiLicense
        {
            Name = "Example License",
            Url = new Uri("https://example.com/license")
        }
    });

    // using System.Reflection;
    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
});

Az előző kódban a Reflection a webes API-projektnek megfelelő XML-fájlnév létrehozására szolgál. Az AppContext.BaseDirectory tulajdonság az XML-fájl elérési útjának létrehozásához használható. Egyes Swagger-funkciók (például a bemeneti paraméterek sémája vagy a megfelelő attribútumokból származó HTTP-metódusok és válaszkódok) XML-dokumentációs fájl használata nélkül működnek. A legtöbb funkció, nevezetesen a metódusösszegzők, valamint a paraméterek és a válaszkódok leírása esetén az XML-fájl használata kötelező.

Három perjellel ellátott megjegyzések hozzáadása egy művelethez javítja a Swagger UI-t, mivel hozzáadja a leírást a szakaszfejléchez. Adjon hozzá egy <összefoglaló> elemet a Delete művelet fölé:

/// <summary>
/// Deletes a specific TodoItem.
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(long id)
{
    var item = await _context.TodoItems.FindAsync(id);

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

    _context.TodoItems.Remove(item);
    await _context.SaveChangesAsync();

    return NoContent();
}

A Swagger felhasználói felülete megjeleníti az előző kód <summary> elemének belső szövegét:

Swagger felhasználói felülete a DELETE metódushoz tartozó

A felhasználói felületet a létrehozott JSON-séma vezérli:

"delete": {
    "tags": [
        "Todo"
    ],
    "summary": "Deletes a specific TodoItem.",
    "parameters": [
        {
            "name": "id",
            "in": "path",
            "description": "",
            "required": true,
            "schema": {
                "type": "integer",
                "format": "int64"
            }
        }
    ],
    "responses": {
        "200": {
            "description": "Success"
        }
    }
},

Adjon hozzá egy <megjegyzés> elemet a Create műveletmetódus dokumentációjában. Kiegészíti a <summary> elemben megadott információkat, és robusztusabb Swagger felhasználói felületet biztosít. A <remarks> elem tartalma szövegből, JSON-ból vagy XML-ből állhat.

/// <summary>
/// Creates a TodoItem.
/// </summary>
/// <param name="item"></param>
/// <returns>A newly created TodoItem</returns>
/// <remarks>
/// Sample request:
///
///     POST /Todo
///     {
///        "id": 1,
///        "name": "Item #1",
///        "isComplete": true
///     }
///
/// </remarks>
/// <response code="201">Returns the newly created item</response>
/// <response code="400">If the item is null</response>
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    await _context.SaveChangesAsync();

    return CreatedAtAction(nameof(Get), new { id = item.Id }, item);
}

Figyelje meg a felhasználói felület fejlesztéseit az alábbi megjegyzésekkel:

Swagger felhasználói felületén további megjegyzések jelennek meg.

Adatjegyzetek

Jelölje meg a modellt a System.ComponentModel.DataAnnotations névtérben található attribútumokkal, hogy segítsen a Swagger felhasználói felület összetevőinek meghajtásában.

Adja hozzá a [Required] attribútumot a Name osztály TodoItem tulajdonságához:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace SwashbuckleSample.Models;

public class TodoItem
{
    public long Id { get; set; }

    [Required]
    public string Name { get; set; } = null!;

    [DefaultValue(false)]
    public bool IsComplete { get; set; }
}

Az attribútum jelenléte megváltoztatja a felhasználói felület viselkedését, és módosítja a mögöttes JSON-sémát:

"schemas": {
    "TodoItem": {
        "required": [
            "name"
        ],
        "type": "object",
        "properties": {
            "id": {
                "type": "integer",
                "format": "int64"
            },
            "name": {
                "type": "string"
            },
            "isComplete": {
                "type": "boolean",
                "default": false
            }
        },
        "additionalProperties": false
    }
},

Adja hozzá a [Produces("application/json")] attribútumot az API-vezérlőhöz. Célja, hogy deklarálja, hogy a vezérlő műveletei támogatják alkalmazás/jsonválasztartalmat:

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

A médiatípus legördülő menü ezt a tartalomtípust választja alapértelmezettként a vezérlő GET műveleteihez:

Swagger felhasználói felülete alapértelmezett választartalomtípussal

A webes API-ban az adatjegyzetek használatának növekedésével a felhasználói felület és az API súgóoldalai leíróbbá és hasznosabbá válnak.

Választípusok leírása

A webes API-t használó fejlesztők leginkább a visszaadott adatokkal foglalkoznak, különösen a választípusokkal és a hibakódokkal (ha nem standard). A választípusok és hibakódok az XML-megjegyzésekben és az adatjegyzetekben jelennek meg.

A Create művelet sikeres végrehajtás esetén egy HTTP 201 állapotkódot ad vissza. A rendszer egy HTTP 400-állapotkódot ad vissza, amikor a közzétett kérelemtörzs null értékű. A Swagger felhasználói felületén található megfelelő dokumentáció nélkül a fogyasztó nem ismeri ezeket a várt eredményeket. A probléma megoldásához adja hozzá a kiemelt sorokat az alábbi példában:

/// <summary>
/// Creates a TodoItem.
/// </summary>
/// <param name="item"></param>
/// <returns>A newly created TodoItem</returns>
/// <remarks>
/// Sample request:
///
///     POST /Todo
///     {
///        "id": 1,
///        "name": "Item #1",
///        "isComplete": true
///     }
///
/// </remarks>
/// <response code="201">Returns the newly created item</response>
/// <response code="400">If the item is null</response>
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public async Task<IActionResult> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    await _context.SaveChangesAsync();

    return CreatedAtAction(nameof(Get), new { id = item.Id }, item);
}

A Swagger felhasználói felülete most már egyértelműen dokumentálja a várt HTTP-válaszkódokat:

A Swagger UI megjeleníti a POST Válaszosztály leírását: 'Az újonnan létrehozott Todo elem visszaadása' és a '400 - Ha az elem null értékű' állapotkódot és annak okát a Válasz Üzenetek szekcióban.

A konvenciók alternatívaként használhatók az egyes műveletek [ProducesResponseType]-nal történő explicit megjelölése helyett. További információ: Webes API-konvenciók használata.

A [ProducesResponseType] dekoráció támogatásához a Swashbuckle.AspNetCore.Annotations csomag bővítményeket kínál a válasz, séma és paraméter metaadatainak engedélyezéséhez és bővítéséhez.

A felhasználói felület testreszabása

Az alapértelmezett felhasználói felület funkcionális és megjeleníthető is. Az API dokumentációs oldalainak azonban az Ön márkáját vagy témáját kell képviselnie. A Swashbuckle-összetevők védjegyezéséhez hozzá kell adni az erőforrásokat a statikus fájlok kiszolgálásához, és létre kell építeni a mappastruktúrát a fájlok üzemeltetéséhez.

Statikus fájl köztes szoftver engedélyezése:

app.UseHttpsRedirection();
app.UseStaticFiles();
app.MapControllers();

További CSS-stíluslapok beszúrásához vegye fel őket a projekt wwwroot mappájába, és adja meg a köztes szoftver beállításainak relatív elérési útját:

if (app.Environment.IsDevelopment())
{
    app.UseSwaggerUI(options => // UseSwaggerUI is called only in Development.
    {
        options.InjectStylesheet("/swagger-ui/custom.css");
    });
}

További erőforrások

Mintakód megtekintése vagy letöltése (hogyan lehet letölteni)

A Swashbuckle három fő összetevőből áll:

  • Swashbuckle.AspNetCore.Swagger: Swagger objektummodell és köztes szoftver, amely JSON-végpontként teszi elérhetővé SwaggerDocument objektumokat.

  • Swashbuckle.AspNetCore.SwaggerGen: egy Swagger-generátor, amely közvetlenül az útvonalakból, vezérlőkből és modellekből készít SwaggerDocument objektumokat. Általában a Swagger végpont köztes szoftverrel kombinálva automatikusan elérhetővé teszi a Swagger JSON-t.

  • Swashbuckle.AspNetCore.SwaggerUI: a Swagger felhasználói felületi eszköz beágyazott verziója. A Swagger JSON-t úgy értelmezi, hogy gazdag, testre szabható felületet hozzon létre a webes API funkcióinak leírásához. Beépített tesztkereteket tartalmaz a nyilvános módszerekhez.

Csomag telepítése

A Swashbuckle a következő módokon adható hozzá:

  • A Package Manager konzol ablakából:

    • Tekintse meg Nézet>Egyéb ablakok>Csomagkezelő konzol

    • Lépjen arra a könyvtárra, amelyben a TodoApi.csproj fájl létezik

    • Hajtsa végre a következő parancsot:

      Install-Package Swashbuckle.AspNetCore -Version 5.6.3
      
  • A NuGet-csomagok kezelése ablakban:

    • Kattintson a jobb gombbal a projektre Megoldáskezelőben>NuGet-csomagok kezelése
    • A csomag forrásának beállítása "nuget.org" értékre
    • Győződjön meg arról, hogy az "Előzetes kiadás befoglalása" lehetőség be van kapcsolva.
    • Írja be a "Swashbuckle.AspNetCore" kifejezést a keresőmezőbe
    • Válassza ki a legújabb "Swashbuckle.AspNetCore" csomagot a Tallózás lapon, majd kattintson a Telepítés gombra.

Swagger köztes szoftver hozzáadása és konfigurálása

Adja hozzá a Swagger-generátort a Startup.ConfigureServices metódus szolgáltatásgyűjteményéhez:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TodoContext>(opt =>
        opt.UseInMemoryDatabase("TodoList"));
    services.AddControllers();

    // Register the Swagger generator, defining 1 or more Swagger documents
    services.AddSwaggerGen();
}

A Startup.Configure metódusban engedélyezze a köztes szoftver számára a létrehozott JSON-dokumentum és a Swagger felhasználói felület kiszolgálását:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.)
        app.UseSwaggerUI();
    }

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Jegyzet

A Swashbuckle az MVC Microsoft.AspNetCore.Mvc.ApiExplorer-ra támaszkodik az útvonalak és végpontok felfedezéséhez. Ha a projekt meghívja AddMvc, az útvonalak és végpontok automatikusan felderítve lesznek. AddMvcCorehívásakor a AddApiExplorer metódust explicit módon kell meghívni. További információ: Swashbuckle, ApiExplorer és Routing.

A fejlesztés során az előző UseSwaggerUI metódushívás lehetővé teszi a Swagger felhasználói felületi eszköz beágyazott verzióját. Ez a Static File Middlewarefügg. Ha a .NET-keretrendszert vagy a .NET Core 1.x-et célozza, adja hozzá a Microsoft.AspNetCore.StaticFiles NuGet-csomagot a projekthez.

Indítsa el az alkalmazást, és navigáljon a(z) http://localhost:<port>/swagger/v1/swagger.json-hoz. A végpontokat leíró létrehozott dokumentum a OpenAPI-specifikációban (openapi.json)látható módon jelenik meg.

A Swagger felhasználói felület megtalálható a http://localhost:<port>/swaggerhelyen. Fedezze fel az API-t a Swagger felhasználói felületén keresztül, és építse be más programokba.

Tipp

A Swagger felhasználói felületének az alkalmazás gyökerénél (http://localhost:<port>/) való kiszolgálásához állítsa a RoutePrefix tulajdonságot üres sztringre:

// // UseSwaggerUI Protected by if (env.IsDevelopment())
app.UseSwaggerUI(c => // UseSwaggerUI Protected by if (env.IsDevelopment())
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    c.RoutePrefix = string.Empty;
});

Ha címtárakat használ IIS-vel vagy fordított proxyval, állítsa a Swagger-végpontot egy relatív elérési útra a ./ előtag használatával. Például ./swagger/v1/swagger.json. A /swagger/v1/swagger.json használatakor az alkalmazás utasítást kap, hogy keresse meg a JSON-fájlt az URL valódi gyökerénél, valamint az útvonalelőtaggal, ha használják. Használjon például http://localhost:<port>/<route_prefix>/swagger/v1/swagger.jsonhttp://localhost:<port>/<virtual_directory>/<route_prefix>/swagger/v1/swagger.jsonhelyett.

Jegyzet

Alapértelmezés szerint a Swashbuckle létrehozza és elérhetővé teszi a Swagger JSON-t a specifikáció 3.0-s verziójában – hivatalos nevén OpenAPI-specifikációban. A visszamenőleges kompatibilitás támogatásához inkább a JSON 2.0-s formátumban való megjelenítését választhatja. Ez a 2.0 formátum olyan integrációk esetében fontos, mint a Microsoft Power Apps és a Microsoft Flow, amelyek jelenleg támogatják az OpenAPI 2.0-s verzióját. A 2.0 formátumra való választáshoz állítsa be a SerializeAsV2 tulajdonságot a Startup.Configure-ben.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger(c =>
        {
            c.SerializeAsV2 = true;
        });

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        // UseSwaggerUI is called only in Development.
        app.UseSwaggerUI(c => // UseSwaggerUI Protected by if (env.IsDevelopment())
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
    }

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Testreszabás és bővítés

A Swagger lehetővé teszi az objektummodell dokumentálását és a felhasználói felület testreszabását a témának megfelelően.

Az Startup osztályban adja hozzá a következő névtereket:

using System;
using System.Reflection;
using System.IO;

API-információk és leírás

A AddSwaggerGen metódusnak átadott konfigurációs művelet olyan információkat ad hozzá, mint a szerző, a licenc és a leírás:

A Startup osztályban importálja a következő névteret a OpenApiInfo osztály használatához:

using Microsoft.OpenApi.Models;

A OpenApiInfo osztály használatával módosítsa a felhasználói felületen megjelenő információkat:

// Register the Swagger generator, defining 1 or more Swagger documents
services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo
    {
        Version = "v1",
        Title = "ToDo API",
        Description = "A simple example ASP.NET Core Web API",
        TermsOfService = new Uri("https://example.com/terms"),
        Contact = new OpenApiContact
        {
            Name = "Shayne Boyer",
            Email = string.Empty,
            Url = new Uri("https://twitter.com/spboyer"),
        },
        License = new OpenApiLicense
        {
            Name = "Use under LICX",
            Url = new Uri("https://example.com/license"),
        }
    });
});

A Swagger felhasználói felülete megjeleníti a verzió adatait:

Swagger felhasználói felület verzióinformációkkal: leírás, szerző és további információ megtekintése.

XML-megjegyzések

Az XML-megjegyzések a következő módszerekkel engedélyezhetők:

  • Kattintson a jobb gombbal a projektre Megoldáskezelő, és válassza a Edit <project_name>.csprojlehetőséget.
  • Adja hozzá manuálisan a kiemelt sorokat a .csproj fájlhoz:
<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

Az XML-megjegyzések engedélyezése hibakeresési információkat biztosít a nem dokumentált nyilvános típusok és tagok számára. A nem dokumentált típusokat és tagokat a figyelmeztető üzenet jelzi. Az alábbi üzenet például az 1591-ben megjelenő figyelmeztető kód megsértését jelzi:

warning CS1591: Missing XML comment for publicly visible type or member 'TodoController.GetAll()'

A projektszintű figyelmeztetések mellőzéséhez definiálja a projektfájlban figyelmen kívül hagyandó figyelmeztető kódok pontosvesszővel tagolt listáját. Ha hozzáfűzi a figyelmeztetési kódokat a $(NoWarn);-hoz, akkor a C# alapértelmezett értékei is alkalmazásra kerülnek-ben.

<PropertyGroup>
  <GenerateDocumentationFile>true</GenerateDocumentationFile>
  <NoWarn>$(NoWarn);1591</NoWarn>
</PropertyGroup>

Ha csak bizonyos tagok figyelmeztetéseit szeretné letiltani, a kódot #pragma figyelmeztetési előfeldolgozási irányelvekbe kell belefoglalnia. Ez a módszer olyan kódok esetében hasznos, amelyeket nem szabad az API-dokumentumokon keresztül elérhetővé tenni. Az alábbi példában a CS1591 figyelmeztető kód figyelmen kívül lesz hagyva a teljes Program osztályban. A figyelmeztető kód érvényesítése az osztálydefiníció végén lesz visszaállítva. Adjon meg több figyelmeztető kódot vesszővel tagolt listával.

namespace TodoApi
{
#pragma warning disable CS1591
    public class Program
    {
        public static void Main(string[] args) =>
            BuildWebHost(args).Run();

        public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .Build();
    }
#pragma warning restore CS1591
}

Konfigurálja a Swaggert az előző utasítások alapján létrehozott XML-fájl használatára. Linux vagy más nem Windows operációs rendszerek esetén a fájlnevek és az elérési utak megkülönböztethetik a kis- és nagybetűket. Egy TodoApi.XML fájl például Windows rendszeren érvényes, de nem Ubuntu.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<TodoContext>(opt =>
        opt.UseInMemoryDatabase("TodoList"));
    services.AddControllers();

    // Register the Swagger generator, defining 1 or more Swagger documents
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo
        {
            Version = "v1",
            Title = "ToDo API",
            Description = "A simple example ASP.NET Core Web API",
            TermsOfService = new Uri("https://example.com/terms"),
            Contact = new OpenApiContact
            {
                Name = "Shayne Boyer",
                Email = string.Empty,
                Url = new Uri("https://twitter.com/spboyer"),
            },
            License = new OpenApiLicense
            {
                Name = "Use under LICX",
                Url = new Uri("https://example.com/license"),
            }
        });

        // Set the comments path for the Swagger JSON and UI.
        var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        c.IncludeXmlComments(xmlPath);
    });
}

Az előző kódban a Reflection a webes API-projektnek megfelelő XML-fájlnév létrehozására szolgál. Az AppContext.BaseDirectory tulajdonság az XML-fájl elérési útjának létrehozásához használható. Egyes Swagger-funkciók (például a bemeneti paraméterek sémája vagy a megfelelő attribútumokból származó HTTP-metódusok és válaszkódok) XML-dokumentációs fájl használata nélkül működnek. A legtöbb funkció, nevezetesen a metódusösszegzők, valamint a paraméterek és a válaszkódok leírása esetén az XML-fájl használata kötelező.

Három perjellel ellátott megjegyzések hozzáadása egy művelethez javítja a Swagger UI-t, mivel hozzáadja a leírást a szakaszfejléchez. Adjon hozzá egy <összefoglaló> elemet a Delete művelet fölé:

/// <summary>
/// Deletes a specific TodoItem.
/// </summary>
/// <param name="id"></param>        
[HttpDelete("{id}")]
public IActionResult Delete(long id)
{
    var todo = _context.TodoItems.Find(id);

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

    _context.TodoItems.Remove(todo);
    _context.SaveChanges();

    return NoContent();
}

A Swagger felhasználói felülete megjeleníti az előző kód <summary> elemének belső szövegét:

Swagger felhasználói felülete a DELETE metódushoz tartozó

A felhasználói felületet a létrehozott JSON-séma vezérli:

"delete": {
    "tags": [
        "Todo"
    ],
    "summary": "Deletes a specific TodoItem.",
    "operationId": "ApiTodoByIdDelete",
    "consumes": [],
    "produces": [],
    "parameters": [
        {
            "name": "id",
            "in": "path",
            "description": "",
            "required": true,
            "type": "integer",
            "format": "int64"
        }
    ],
    "responses": {
        "200": {
            "description": "Success"
        }
    }
}

Adjon hozzá egy <megjegyzés> elemet a Create műveletmetódus dokumentációjában. Kiegészíti a <summary> elemben megadott információkat, és robusztusabb Swagger felhasználói felületet biztosít. A <remarks> elem tartalma szövegből, JSON-ból vagy XML-ből állhat.

/// <summary>
/// Creates a TodoItem.
/// </summary>
/// <remarks>
/// Sample request:
///
///     POST /Todo
///     {
///        "id": 1,
///        "name": "Item1",
///        "isComplete": true
///     }
///
/// </remarks>
/// <param name="item"></param>
/// <returns>A newly created TodoItem</returns>
/// <response code="201">Returns the newly created item</response>
/// <response code="400">If the item is null</response>            
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<TodoItem> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    _context.SaveChanges();

    return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
}

Figyelje meg a felhasználói felület fejlesztéseit az alábbi megjegyzésekkel:

Swagger felhasználói felületén további megjegyzések jelennek meg.

Adatjegyzetek

Jelölje meg a modellt a System.ComponentModel.DataAnnotations névtérben található attribútumokkal, hogy segítsen a Swagger felhasználói felület összetevőinek meghajtásában.

Adja hozzá a [Required] attribútumot a Name osztály TodoItem tulajdonságához:

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace TodoApi.Models
{
    public class TodoItem
    {
        public long Id { get; set; }

        [Required]
        public string Name { get; set; }

        [DefaultValue(false)]
        public bool IsComplete { get; set; }
    }
}

Az attribútum jelenléte megváltoztatja a felhasználói felület viselkedését, és módosítja a mögöttes JSON-sémát:

"definitions": {
    "TodoItem": {
        "required": [
            "name"
        ],
        "type": "object",
        "properties": {
            "id": {
                "format": "int64",
                "type": "integer"
            },
            "name": {
                "type": "string"
            },
            "isComplete": {
                "default": false,
                "type": "boolean"
            }
        }
    }
},

Adja hozzá a [Produces("application/json")] attribútumot az API-vezérlőhöz. Célja, hogy deklarálja, hogy a vezérlő műveletei támogatják alkalmazás/jsonválasztartalmat:

[Produces("application/json")]
[Route("api/[controller]")]
[ApiController]
public class TodoController : ControllerBase
{
    private readonly TodoContext _context;

A Válasz tartalomtípusa legördülő menü ezt a tartalomtípust választja alapértelmezettként a vezérlő GET műveleteihez:

Swagger felhasználói felület alapértelmezett választartalomtípussal.

A webes API-ban az adatjegyzetek használatának növekedésével a felhasználói felület és az API súgóoldalai leíróbbá és hasznosabbá válnak.

Választípusok leírása

A webes API-t használó fejlesztők leginkább a visszaadott adatokkal foglalkoznak, különösen a választípusokkal és a hibakódokkal (ha nem standard). A választípusok és hibakódok az XML-megjegyzésekben és az adatjegyzetekben jelennek meg.

A Create művelet sikeres végrehajtás esetén egy HTTP 201 állapotkódot ad vissza. A rendszer egy HTTP 400-állapotkódot ad vissza, amikor a közzétett kérelemtörzs null értékű. A Swagger felhasználói felületén található megfelelő dokumentáció nélkül a fogyasztó nem ismeri ezeket a várt eredményeket. A probléma megoldásához adja hozzá a kiemelt sorokat az alábbi példában:

/// <summary>
/// Creates a TodoItem.
/// </summary>
/// <remarks>
/// Sample request:
///
///     POST /Todo
///     {
///        "id": 1,
///        "name": "Item1",
///        "isComplete": true
///     }
///
/// </remarks>
/// <param name="item"></param>
/// <returns>A newly created TodoItem</returns>
/// <response code="201">Returns the newly created item</response>
/// <response code="400">If the item is null</response>            
[HttpPost]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public ActionResult<TodoItem> Create(TodoItem item)
{
    _context.TodoItems.Add(item);
    _context.SaveChanges();

    return CreatedAtRoute("GetTodo", new { id = item.Id }, item);
}

A Swagger felhasználói felülete most már egyértelműen dokumentálja a várt HTTP-válaszkódokat:

A Swagger UI megjeleníti a POST Válaszosztály leírását: 'Az újonnan létrehozott Todo elem visszaadása' és a '400 - Ha az elem null értékű' állapotkódot és annak okát a Válasz Üzenetek szekcióban.

Az ASP.NET Core 2.2-ben vagy újabb verzióiban a konvenciók alternatívaként használhatók az egyes műveletek explicit díszítésére [ProducesResponseType]-val. További információ: Webes API-konvenciók használata.

A [ProducesResponseType] dekoráció támogatásához a Swashbuckle.AspNetCore.Annotations csomag bővítményeket kínál a válasz, séma és paraméter metaadatainak engedélyezéséhez és bővítéséhez.

A felhasználói felület testreszabása

Az alapértelmezett felhasználói felület funkcionális és megjeleníthető is. Az API dokumentációs oldalainak azonban az Ön márkáját vagy témáját kell képviselnie. A Swashbuckle-összetevők védjegyezéséhez hozzá kell adni az erőforrásokat a statikus fájlok kiszolgálásához, és létre kell építeni a mappastruktúrát a fájlok üzemeltetéséhez.

Ha a .NET-keretrendszert vagy a .NET Core 1.x-et célozza, adja hozzá a Microsoft.AspNetCore.StaticFiles NuGet-csomagot a projekthez:

<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />

Az előző NuGet-csomag már telepítve van, ha a .NET Core 2.x-et célozza, és a metapackagehasználja.

Statikus fájl köztes szoftver engedélyezése:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStaticFiles();

    if (env.IsDevelopment())
    {
        // Enable middleware to serve generated Swagger as a JSON endpoint.
        app.UseSwagger();

        // Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
        // specifying the Swagger JSON endpoint.
        app.UseSwaggerUI(c => // UseSwaggerUI Protected by if (env.IsDevelopment())
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
    }

    app.UseRouting();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

További CSS-stíluslapok beszúrásához vegye fel őket a projekt wwwroot mappájába, és adja meg a köztes szoftver beállításainak relatív elérési útját:

if (env.IsDevelopment())
{
    app.UseSwaggerUI(c =>
    {
        c.InjectStylesheet("/swagger-ui/custom.css");
    }
}

További erőforrások