C
C#17mo ago
dvdmeer

❔ Add content negotiation to my .net 7 Minimal API project

.NET 7 Minimal API does not do content negotiation and as such always returns JSON. What if I would like my Minimal API to return XML, based on the Accept request header? So far I can create an endpoint filter and have some basic code that checks for the Accept header that I want but a few things are not clear to me: 1. How can I get and manipulate the response body? 2. I noticed that for my API, when I send an authentication request "result" will be of type Ok<AuthResult> where "AuthResult" is one of my model classes that holds my token and some other info. As this is not yet JSON I assume that the conversion to JSON happens at a later stage. Is this correct? 3. If it happens at a later stage, how can I then manipulate the body and send back the response in XML instead? 4. I assume that when I have it working for my single authentication endpoint in order to make it work for the rest I will need to create an endpoint filter factory in order to make it generic enough so that it will work for other objects also? Note that my sample filter does not do anything yet as I have yet to figure out how to add the rest. public class SampleEndpointFilter : IEndpointFilter { public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next) { var result = await next(context); if (context.HttpContext.Request.Headers.Accept.ToString().ToUpper() == "APPLICATION/XML") { } return result; } } Can anyone help me adding the necessary code to let me change the JSON body to XML instead? Or at least help me on my way? Thanks
3 Replies
Pobiega
Pobiega17mo ago
Andrew Lock | .NET Escapades
Returning XML from minimal APIs in .NET 6
In this post I show how to return an XML response from minimal APIs, how to create a helper extension method, and discuss performance considerations
Pobiega
Pobiega17mo ago
its not content negotiation as such, but it lets you return XML. but if you set your endpoints to return IResult<T> it might work
Accord
Accord17mo ago
Was this issue resolved? If so, run /close - otherwise I will mark this as stale and this post will be archived until there is new activity.