Skip to content

Using v1 pattern in url for minimal API .NET 6 versioning #830

Closed
@Sonic3R

Description

@Sonic3R

Hi

I want to use /v1/orders or /v2/orders pattern using api versioning

Well, I configured like:

var builder = WebApplication.CreateBuilder(args);
ApiVersion apiV1 = new ApiVersion(1);
ApiVersion apiV2 = new ApiVersion(2);

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddApiVersioning(opts =>
{
    opts.ReportApiVersions = true;
    opts.ApiVersionReader = new UrlSegmentApiVersionReader();
}).AddApiExplorer(opts =>
{
    opts.GroupNameFormat = "'v'VVV";
    opts.SubstituteApiVersionInUrl = true;
});

builder.Services.AddTransient<IConfigureOptions<SwaggerGenOptions>, ConfigureSwaggerOptions>();
builder.Services.AddSwaggerGen();

// other DI calls

var app = builder.Build();
var orderApiSet = app.NewApiVersionSet("Orders").Build();

app.MapGet("/orders", async ([FromServices] IOrdersRepository orderRepo) =>
{
    return await orderRepo.ListAsync(...);
}).WithApiVersionSet(orderApiSet)
  .HasApiVersion(apiV1);

app.MapGet("/orders", async ([FromServices] IOrdersRepositoryV2 orderRepo) =>
{
    return await orderRepo.List1Async(...);
}).WithApiVersionSet(orderApiSet)
  .HasApiVersion(apiV2);


app.UseSwagger();
app.UseSwaggerUI(opts =>
{
        var descriptions = app.DescribeApiVersions();
        foreach (var desc in descriptions)
        {
            var url = $"/swagger/{desc.GroupName}/swagger.json";
            var name = desc.GroupName.ToUpperInvariant();
            opts.SwaggerEndpoint(url, $"Orders API {name}");
        }
});

await app.RunAsync();

I expected if type in url like /v1/orders that would go to first MapGet but I got 404 page. As well as for /v2/orders

If I type /orders without any vX then I got 400 that api version is not specified.

How to solve this ?

A solution would be app.MapGet("v{version:apiVersion}/orders") but in SwaggerUI displays like:

image

But is not quite good because I already selected api version from top right corner dropdown, don't see the purpose of {version} in call

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions