Reputation: 1481
I’m trying to test backend connectivity in Azure API Management (APIM) using a send-request policy. I am trying in an automated solution for our developers to use an azuredevops pipeline where they can input the backend endpoint url to test the connectivity. I want to dynamically set the URL using a Named Value stored in APIM. We don’t have any way to test the network connectivity in the apim subnet as it’s a dedicated subnet and we would need this solution to check the connectivities enabled before creating the actual APIs.
However, I keep getting the error:
Cannot implicitly convert type 'object' to 'string'. An explicit conversion exists.
I used the following policy:
<!-- Send request to the backend URL -->
<send-request mode="new" response-variable-name="connectivityTest">
<set-url>@(context.Variables["backendUrl"])</set-url>
<set-method>GET</set-method>
</send-request>
<!-- Check response and return result -->
<choose>
<when condition="@(context.Variables["connectivityTest"].StatusCode == 200)">
<return-response>
<set-status code="200" reason="OK" />
<set-body>Backend is reachable</set-body>
</return-response>
</when>
<otherwise>
<return-response>
<set-status code="502" reason="Bad Gateway" />
<set-body>Backend is not reachable</set-body>
</return-response>
</otherwise>
</choose>
What I Have Tried: • I tried using .ToString() but still received the same error. • I verified that the Named Value testBackendUrl exists in APIM and has a valid string value. • I also tried using different ways of casting but no luck.
How do I correctly convert the Named Value to a string to use in the element? • Is there a better way to reference Named Values in APIM policies?
Environment: • Azure API Management • Named Value testBackendUrl is defined in APIM with a placeholder value like https://dummy.url.
Any help would be greatly appreciated!
Feel free to adjust the wording as needed before posting on Stack Overflow.
Upvotes: 0
Views: 45
Reputation: 4041
I was able to get syntax accepted with
context.Variables[]
to the safer context.Variables.GetValueOrDefault<string>()
context.Variables["connectivityTest"]
with IResponse
<!-- Send request to the backend URL -->
<send-request mode="new" response-variable-name="connectivityTest">
<set-url>@(context.Variables.GetValueOrDefault<string>("backendUrl",""))</set-url>
<set-method>GET</set-method>
</send-request>
<!-- Check response and return result -->
<choose>
<when condition="@(context.Variables.GetValueOrDefault<IResponse>("connectivityTest",null).StatusCode == 200)">
<return-response>
<set-status code="200" reason="OK" />
<set-body>Backend is reachable</set-body>
</return-response>
</when>
<otherwise>
<return-response>
<set-status code="502" reason="Bad Gateway" />
<set-body>Backend is not reachable</set-body>
</return-response>
</otherwise>
</choose>
I did not run/test the code, but it reflects what we use in many other parts of our APIM code base.
Upvotes: 1