David Gard
David Gard

Reputation: 12087

Check whether or not a query parameter is set

In Azure API Management, I need to check whether or not a query parameter is set. To achieve this, I'm trying to use context.Request.Url.Query.GetValueOrDefault(queryParameterName: string, defaultValue: string).

According to the documentation, this expression works as follows -

Returns comma separated query parameter values or defaultValue if the parameter is not found.

With that in mind, I used the example from the MS blog Policy Expressions in Azure API Management, to create the following <inbound> policy -

<set-variable name="uniqueId" value="@(context.Request.Url.Query.GetValueOrDefault("uniqueId", ""))" />

However, whenever I include this policy, execution fails with 404 Resource Not Found. Upon inspection of the trace, I can see that the execution was aborted without error before a single policy was evaluated (no matter where within <inbound> the above policy is placed.

This behavour results in the following <backend> trace, which explains the 404

    "backend": [
        {
            "source": "configuration",
            "timestamp": "2017-09-07T12:42:13.8974772Z",
            "elapsed": "00:00:00.0003536",
            "data": {
                "message": "Unable to identify Api or Operation for this request. Responding to the caller with 404 Resource Not Found."
            }
        }
    ],

Given that the MS documentation seems to be inaccurate, how can I check whether or not a query parameter is set?

Upvotes: 1

Views: 3318

Answers (1)

David Gard
David Gard

Reputation: 12087

So the answer here is that there is (another) MS bug.

When the API operation was originally created, the uniqueId query parameter was set as required. I changed this so that it was not required before adding the policy described in my question, however a bug within the new Azure Portal means that when you uncheck the Required box adjacent to the query parameter and then save your changes, they are ignored.

I was able to work around this behaviour be editng the YAML template in the OpenAPPI specification view, removing the declaration required: true for the query parameter in question. The expresion within my policy now works as expected.

Please note: that this workaround sheds light on yet another bug, where saving the template results in your policies being deleted, so make sure you take a copy first.

Upvotes: 3

Related Questions