如何解决迭代Azure API管理策略中的数组声明
我想在azure api管理策略中迭代对JWT令牌的声明
<set-variable name="testparams" value="@(context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"].FirstOrDefault())" />
<set-variable name="values">
{% for value in testparams %}
if(value=="BMW")
<set-variable name="testparams" value=true />
break
else
<set-variable name="testparams" value=false />
{% endfor %}
/>
<base />
</inbound>
<policies>
这是我要迭代并设置成功的变量的方式。当我将此代码放入天蓝色策略时,它显示语法错误。如何实现此目标?
索赔是
carlist =“ [宝马,奥迪,菲亚特]”
解决方法
您的代码中有一些错误。
首先,.FirstOrDefault()
将获得列表的第一项。根据我的测试,它将获得“ 宝马”,而不是“ [宝马,奥迪,菲亚特] ”。
然后,如果我们使用不带<set-variable name="testparams" value="@(context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"])" />
的{{1}}。由于无法在.FirstOrDefault()
标签中将变量设置为数组,因此将显示错误消息。
除此之外,在您的下一个代码中,我对如何设置变量感到困惑。我不知道您是否要将值<set-variable>
设置为变量true/false
或变量testparams
。代码中有一些语法错误。
根据一些测试,我认为很难从jwt令牌中获取数组列表并将其设置为values
标签中的变量。我提供了一种变通方法供您参考,可以在<set-variable>
的代码中设置变量resultVar
。请检查它是否满足您的要求。
<set-body>
,
或者您可以像这样简化您的机体
<inbound>
<base />
<set-body>@{
string[] carList = context.Request.Headers["Authorization"].First().Split(' ')[1].AsJwt()?.Claims["carlist"];
return carList.Contains("BMW").ToString();
}
</set-body>
</inbound>
,
如果输入为 json 类型时,如果有人仍在寻找在 set-variable 中循环的答案,这可能会有所帮助
<set-variable name="values" value="@{
JObject json = (JObject)context.Variables["testparams"];
var array = (json)["carlist"];
var ret = (string)"";//set some default string or bool data;
foreach (var value in array)
{
if ((string)value=="BMW")
{
ret = "true";
break;
}
else
{
ret = "false";
}
}
return ret;
}" />
(我只在我处理过的一个场景中使用了“If”。还没有真正尝试过“else”。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。