In this post, let's see how we can replace backend API URLs in the response body from an Azure API Management (APIM) policy.
Say, we have a backend API endpoint that has the following code.
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
WebApplication app = builder.Build();
app.UseHttpsRedirection();
app.MapGet("/endpoints", (HttpContext httpContext) =>
{
string baseUrl = $"{httpContext.Request.Scheme}://{httpContext.Request.Host}";
return new
{
StatusQueryUri = $"{baseUrl}/status",
HealthQueryUri = $"{baseUrl}/health",
};
})
.WithName("GetEndpoints")
.WithOpenApi(); // other endpoints
And it would work as follows.
Response from Backend API |
Now if we are exposing this API via Azure APIM, we can't be returning internal
endpoints. We need to replace the Base URL with the corresponding APIM API
endpoints.
To achieve that we can use set-body policy and do something like the following.
<policies>
<inbound>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<set-body>
@{
string urlToReplace = context.Request.Url.Scheme + "://" + context.Request.Url.Host;
string urlToReplaceWith = context.Request.OriginalUrl.Scheme
+ "://" + context.Request.OriginalUrl.Host
+ context.Api.Path;
string response = context.Response.Body.As<string>();
return response.Replace(urlToReplace, urlToReplaceWith);
}
</set-body>
</outbound>
<on-error>
<base />
</on-error>
</policies>
Here,
- context.Request.Url: Backend URL
- context.Request.OriginalUrl: URL of the incoming request
- context.Api.Path: API URL Suffix
The output is as follows:
Response from APIM |
Happy Coding.
Regards,
Jaliya
No comments:
Post a Comment