API versioning and OpenAPI
How to use API versioning and OpenAPI (Swagger) for your own APIs.
Umbraco ships with Swagger to document the Content Delivery API. Swagger and the Swagger UI is available at {yourdomain}/umbraco/swagger. For security reasons, both are disabled in production environments.
Due to the way OpenAPI works within ASP.NET Core, we have to apply some configurations in a global scope. If your Umbraco site used Swagger previous to Umbraco 12, these global configurations may interfere with your setup.
In this article we'll explore concrete solutions to overcome challenges with the global configurations.
API versioning
The Umbraco APIs rely on having the requested API version as part of the URL. If you prefer a different versioning for your own APIs, you can setup alternatives while still preserving the functionality of the Umbraco API.
The following code sample illustrates how you can use a custom header to pass the requested API version to your own APIs.
using Asp.Versioning;
using Microsoft.Extensions.Options;
namespace My.Custom.Swagger;
public class MyConfigureApiVersioningOptions : IConfigureOptions<ApiVersioningOptions>
{
public void Configure(ApiVersioningOptions options)
=> options.ApiVersionReader = ApiVersionReader.Combine(
// the URL segment version reader is required for the Umbraco APIs
new UrlSegmentApiVersionReader(),
// here you can add additional version readers to suit your needs
new HeaderApiVersionReader("my-api-version"));
}
public static class MyConfigureApiVersioningUmbracoBuilderExtensions
{
// call this from Program.cs, i.e.:
// builder.CreateUmbracoBuilder()
// ...
// .ConfigureMyApiVersioning()
// .Build();
public static IUmbracoBuilder ConfigureMyApiVersioning(this IUmbracoBuilder builder)
{
builder.Services.ConfigureOptions<MyConfigureApiVersioningOptions>();
return builder;
}
}Swagger route and/or availability
As mentioned in the beginning of this article, Umbraco exposes Swagger and the Swagger UI at {yourdomain}/umbraco/swagger. Both are disabled when the site is in production mode.
The code sample below shows how to change the Swagger route and availability.
Adding custom operation IDs
Custom operation IDs can be a great way to make your API easier to use. Especially for consumers that generate API contracts from your Swagger documents.
The Umbraco APIs use custom operation IDs for that exact reason. In order to remain as un-intrusive as possible, these custom operation IDs are not applied to your APIs.
If you want to apply custom operation IDs to your APIs, you must ensure that the Umbraco APIs retain their custom operation IDs. The following code sample illustrates how this can be done.
Adding custom schema IDs
Custom schema IDs can also make it easier for your API consumers to understand and work with your APIs. To that same end, Umbraco applies custom schema IDs to the Umbraco APIs - but not to your APIs.
If you want to create custom schema IDs for your APIs, you must ensure that the Umbraco APIs retain their custom schema IDs. The following code sample illustrates how that can be done.
Adding your own Swagger documents
Umbraco automatically adds a "default" Swagger document to contain all APIs that are not explicitly mapped to a named Swagger document. This means that your custom APIs will automatically appear in the "default" Swagger document.
If you want to exercise more control over where your APIs show up in Swagger, you can do so by adding your own Swagger documents.
A common use case for this is when you maintain multiple versions of the same API. Often you want to have separate Swagger documents for each version. The following code sample creates two Swagger documents - "My API v1" and "My API v2".
With these Swagger documents in place, you can now assign the different versions of your API controllers to their respective documents using the MapToApi annotation.
Last updated