我们希望能够在apikey的http参数名称中忽略大小写 - 也就是说,我们希望接受ApiKey,APIKEY和Apikey(以及所有其他排列)...但它似乎是请求。 queryparam.apikey只接受“apikey”作为HTTP参数。
我们考虑过使用带有ignoreCase属性的ExtractVariable策略(然后将其分配给另一个变量qp.api_key),但它似乎不起作用(或者我们不完全理解@ignoreCase的作用)..即,qp。只有在我们传递apikey param(而不是ApiKey,apiKey等)时才会分配api_key。
<QueryParam name="apikey">
<Pattern ignoreCase="true">{api_key}</Pattern>
<VariablePrefix>qp</VariablePrefix>
</QueryParam>
我们如何实现apikey HTTP get param的大小写不敏感?
答案 0 :(得分:1)
如果API Key是查询字符串中唯一的参数 - 后续工作
&lt; ExtractVariables async =“false”continueOnError =“false”enabled =“true”name =“extractapikey”&gt; &LT; DisplayName的&GT; ExtractApiKey&LT; / DisplayName的&GT; &lt; Variable name =“request.querystring”&gt; &lt; Pattern ignoreCase =“true”&gt; apikey = {api_key}&lt; / Pattern&gt; &LT; /可变&GT; &LT; / ExtractVariables&GT;
答案 1 :(得分:1)
ignoreCase 属性适用于模式 - 而不是名称。
您的模式不包含您收到的变量以外的任何内容,因此在您的情况下它不会执行任何操作。
但是,模式可以包含包含您期望的模式的周围字符,如:
<QueryParam name="apikey">
<Pattern ignoreCase="true">abc{api_key}</Pattern>
<VariablePrefix>qp</VariablePrefix>
</QueryParam>
在这种情况下,当使用?apikey = abc123 或?apikey = aBc123 调用API代理时,apikey将设置为123。
答案 2 :(得分:0)
+1兰迪建议选择合理 apikey拼写并将所有这些拼写放在一个ExtractVariables政策中:
apikey
APIkey
apiKey
ApiKey
APIKey
APIKEY
如果您真的想要处理所有可能的拼写,另一种解决方案是使用JavaScript标注。您可以访问变量message.queryparam.names,它是所有查询参数名称的集合,或者是message.querystring,它是查询字符串本身。循环遍历名称或解析查询字符串,一旦找到不区分大小写的匹配的参数名称,请获取相应的message.queryparam。{queryparam_name}变量。有关您可以访问的可能变量,请参阅Apigee docs。
答案 3 :(得分:0)
我创建了一个Python脚本策略:
import re
qs = flow.getVariable('request.querystring')
p = re.compile(r".*apikey=(\w+).*", re.IGNORECASE)
m = p.match(qs)
if m is not None:
flow.setVariable('qp.api_key', m.group(1))
在这种情况下,它被分配给qp.api_key并将该ref用于VerifyApiKey策略。
我认为这应该是提取流量变量(即不区分大小写的参数名称)的标准选项,而不是通过额外的策略来执行相同的相对基本的事情。
感谢您的快速反应和想法。
答案 4 :(得分:0)
我建议小写所有参数,因此代码可以使用单个标准命名约定。下面的代码可以在JavaScript策略中执行,以设置稍后可以在任何后续策略中使用的变量。这些变量将成为要从任何其他地方引用的变量。
function setLowerCaseQueryParams(){
var qpnames = request.queryParams;
for(var key in qpnames){
context.setVariable("queryparams." + key.toLowerCase(), request.queryParams[key]);
}
}
setLowerCaseQueryParams();
使用此功能,您始终可以发送任何字符组合。例如,AbCdEFGHijKl = value,abcdEfghijkl = value或ABCDEFGHIJKL = value,它将始终以下列方式访问:
<强> var queryparamval = context.getVariable('queryparams.abcdefghijkl')
强>