忽略大小写请求HTTP查询参数

时间:2014-03-06 00:20:23

标签: apigee

我们希望能够在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的大小写不敏感?

5 个答案:

答案 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')