Implementing middleware
By registering custom middleware handlers, you can perform operations before a request is made. For example, auditing and filtering the request before the client sends it.
Middleware
Create your middleware class and add your business requirements. For example, you might wish to add custom headers to the request or filter headers and content.
public class SaveRequestHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
var jsonContent = await request.Content.ReadAsStringAsync(cancellationToken);
Console.WriteLine($"Request: {jsonContent}");
return await base.SendAsync(request, cancellationToken);
}
}
Register middleware
Create a middleware handlers array and use the existing middleware already implemented within the HTTP library that includes existing handlers like retry, redirect, and more.
var handlers = KiotaClientFactory.CreateDefaultHandlers();
handlers.Add(new SaveRequestHandler());
Next you need to create a delegate chain so the middleware handlers are registered in the right order.
var httpMessageHandler =
KiotaClientFactory.ChainHandlersCollectionAndGetFirstLink(
KiotaClientFactory.GetDefaultHttpMessageHandler(),
handlers.ToArray());
Finally, create a request adapter using an HTTP client. This adapter can then be used when submitting requests from the generated client. This design means different adapters/middleware can be used when calling APIs and therefore gives flexibility to how and when a middleware handler is used.
var httpClient = new HttpClient(httpMessageHandler!);
var adapter = new HttpClientRequestAdapter(authProvider, httpClient:httpClient);
var client = new PostsClient(adapter); // the name of the client will vary based on your generation parameters
Middleware handlers
The following table describes which middleware handlers are implemented by the HTTP package, and which ones are included by default with any new request adapter.
Name | Description | C# Support | Go Support | Java Support | TypeScript Support | PHP Support | Python Support |
---|---|---|---|---|---|---|---|
Authorization | Adds an access token to the request when using a native HTTP client. | Yes | No | Yes | No | No | No |
Body Inspection | Allows the client application to inspect the request and response body through the associated options. | No | No | No | No | No | No |
Chaos | For testing purposes only. Randomly fails requests to allow testing clients' resilience. | Yes | Yes | Yes | Yes | Yes | No |
Headers Inspection | Allows the client application to inspect the request and response headers through the associated options. | Default | Default | Default | Default | Default | Default |
Parameters Name Decoding | Decodes query parameter names that were encoded when building the URL because they contained characters not allowed by RFC 6570. | Default | Default | Default | Default | Default | Default |
Redirect | Automatically follows Location response headers when a 301 or 302 response status code is received. | Default | Default | Default | Default | Default | Default |
Request Compression | Compresses request bodies and retries requests without compression when a 415 response status code is received. | No | Default | No | Default | No | No |
Response Decompression | Adds an Accept-Encoding request header and decompresses any response body with a Content-Encoding response header. | N/A | N/A | N/A | N/A | N/A | N/A |
Retry | Automatically retries requests when a 429 or a 503 response status code is received. | Default | Default | Default | Default | Default | Default |
Sunset | Logs a warning message with Open Telemetry upon receiving a Sunset response header. | No | No | No | No | No | No |
Telemetry | Adds an extension point to augment the request with telemetry headers. | Yes | No | No | Yes | Yes | No |
Uri Replacement | Enables replacement of segments of the request URI before it's sent out. | Default | Yes | Default | Yes | Yes | Default |
User Agent | Adds the kiota http library version to the user agent request header. | Default | Default | Default | Default | Default | Default |
Note
Languages with N/A in the response decompression column leverage the native response decompression offered by the HTTP client instead.
Note
Languages with Default for the handler support value include the handler by default when creating the request adapter with no additional configuration.
Note
Request body decompression is not enabled by default in ASP.NET Core APIs and needs to be enabled. Find out how to enable it with Request Decompression in ASP.NET core.