In this post, let's have a look at a nice feature that's now available with Azure Functions. That is being able to expose HTTP trigger functions via an Open API specification endpoint.
Let's go with an example. I already have an In-Process .NET Azure Function created with a single HTTP Trigger function.
The first step to enable Open API specification is to install the following NuGet package.
dotnet add package Microsoft.Azure.WebJobs.Extensions.OpenApi -v 1.0.0
Once that is done, if we run the Function App locally, we should be seeing
something interesting.
Additional Endpoints |
OpenAPI Document |
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using System.Net; namespace FunctionApp1; public static class Function1 { [FunctionName("Function1")] [OpenApiOperation(operationId: "Run", tags: new[] { "GETTERS" })] [OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", In = OpenApiSecurityLocationType.Query)] [OpenApiParameter(name: "name", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **Name** parameter")] [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The OK response")] public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequest req, ILogger log) { string name = req.Query["name"]; string responseMessage = $"Hello, {name}. This HTTP triggered function executed successfully."; return new OkObjectResult(responseMessage); } }
And now if I run the function app, I should be seeing my HTTP Trigger
function.
OpenAPI Document |
OpenAPI Document |
.NET 6 (In-Process) - Http trigget with OpenAPI |
If you want to enable Open API specification for
Isolated (Out-of-process) .NET Azure Functions, you need to install the following NuGet package.
dotnet add package Microsoft.Azure.Functions.Worker.Extensions.OpenApi -v 1.0.0
Once that's done, you need to update the Program.cs as follows.
Program.cs
using Microsoft.Azure.Functions.Worker.Extensions.OpenApi.Extensions; using Microsoft.Extensions.Hosting; namespace FunctionApp3; public class Program { public static void Main() { IHost host = new HostBuilder() .ConfigureFunctionsWorkerDefaults(worker => worker.UseNewtonsoftJson()) .ConfigureOpenApi() .Build(); host.Run(); } }
And then decorate the Functions the same way as in In-Process model.
using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Attributes; using Microsoft.Azure.WebJobs.Extensions.OpenApi.Core.Enums; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using System.Collections.Specialized; using System.Net; using System.Web; namespace FunctionApp3; public class Function1 { private readonly ILogger _logger; public Function1(ILoggerFactory loggerFactory) { _logger = loggerFactory.CreateLogger<Function1>(); } [Function("Function1-Isolated")] [OpenApiOperation(operationId: "Run", tags: new[] { "GETTERS" })] [OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", In = OpenApiSecurityLocationType.Query)] [OpenApiParameter(name: "name", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **Name** parameter")] [OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The OK response")] public HttpResponseData Run([HttpTrigger(AuthorizationLevel.Function, "get")] HttpRequestData req) { NameValueCollection query = HttpUtility.ParseQueryString(req.Url.Query); string name = query["name"]; HttpResponseData response = req.CreateResponse(HttpStatusCode.OK); response.Headers.Add("Content-Type", "text/plain; charset=utf-8"); string responseMessage = $"Hello, {name}. This HTTP triggered function executed successfully."; response.WriteString(responseMessage); return response; } }
That's about it. Now if we run this, it should be working the same way as in
In-Process mode.
Happy Coding.
Regards.
Jaliya
No comments:
Post a Comment