Azure APIM Validate Parameters策略对URL路径参数校验失效问题
问题:Azure APIM无法校验缺失路径参数的请求并返回400错误
问题背景
我有一个Azure HTTP触发函数,路由配置为v1/users/{profileid},已导入Azure APIM。当访问不带profileid的URL(如https://sampleapidemo-apim-poc.azure-api.net/v1/users/)时,实际返回404错误,但期望返回400错误并提示“Bad Request. Profile ID is missing in URL path”。
现有配置
函数代码
public async Task<IActionResult> FetchUser( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/users/{profileid}")] HttpRequest req, string profileid)
APIM访问URL
https://sampleapidemo-apim-poc.azure-api.net/v1/users/PROFILEIDTOBEENTER
尝试过的两种无效策略
- 使用
validate-parameters策略:
<validate-parameters specified-parameter-action="prevent" unspecified-parameter-action="prevent" errors-variable-name="requestUrlValidation"> <path specified-parameter-action="prevent"> <parameter name="profileid" action="prevent" /> </path> </validate-parameters>
- 使用变量判断路径包含字符串:
<set-variable name="profileParameter" value="@(context.Request.Url.Path.Contains("profileid"))" /> <choose> <when condition="@((bool)context.Variables["profileParameter"] == false)"> <return-response> <set-status code="400" reason="Bad Request" /> <set-body> <value>Profile Id is missing in url path.</value></set-body> </return-response> </when> <otherwise /> </choose>
实际与期望结果
- 实际输出:访问缺失
profileid的URL时返回404:
{ "statusCode": 404, "message": "Resource not found" }
- 期望输出:返回400错误:
{ "statusCode": 400, "message": "Bad Request. Profile ID is missing in URL path" }
问题原因
当请求URL为v1/users/时,APIM会优先匹配API的路由模板。由于原API的路由是v1/users/{profileid},而v1/users/并不匹配该模板,APIM会直接返回404,不会触发入站策略的执行。
解决方案
方案1:添加匹配v1/users/的独立操作
- 在APIM的目标API下,新增一个GET操作,路由设置为
v1/users/。 - 为该操作配置入站策略:
<return-response> <set-status code="400" reason="Bad Request" /> <set-body> { "statusCode": 400, "message": "Bad Request. Profile ID is missing in URL path" } </set-body> </return-response>
方案2:修改现有操作路由并添加参数校验
- 将现有操作的路由模板修改为
v1/users/{profileid?}(?标记参数为可选)。 - 为该操作配置入站策略,校验
profileid是否为空:
<choose> <when condition="@(string.IsNullOrEmpty(context.Request.MatchedParameters["profileid"]))"> <return-response> <set-status code="400" reason="Bad Request" /> <set-body> { "statusCode": 400, "message": "Bad Request. Profile ID is missing in URL path" } </set-body> </return-response> </when> <otherwise /> </choose>
验证结果
配置完成后,访问https://sampleapidemo-apim-poc.azure-api.net/v1/users/将返回期望的400错误响应。
内容的提问来源于stack exchange,提问作者PavanKumar GVVS
相关产品推荐
相关产品推荐

