对于具有多值查询参数的请求,例如:https://test.apigee.net?storeIds=abc&storeIds=xyz
,有人可以如何设置提取变量策略,以便有一个storeIds数组,如:storeIds=["abc","xyz"]
?
更新#1: 在javascript中使用以下Apigee:
var arrayOfStoreIds = [];
for (i = 0; i < context.proxyRequest.queryParams['storeIds'].length; i++) {
arrayOfStoreIds.push(context.proxyRequest.queryParams['storeIds'][i]);
}
产生错误:
`Execution of script failed with error:
Javascript runtime error:
"TypeError: Cannot find default value for object ... at line ##"`
#引用的行指向for
循环的第1行
更新#2:
context.proxyRequest.queryParams['city'].length; // == 2
context.proxyRequest.queryParams['city'].length(); // == 2
所以这个context.proxyRequest.queryParams['storeIds'].length()
就行了!至少在javascript中......我仍然不知道如何通过提取变量策略来实现这一点......
答案 0 :(得分:1)
说实话,there is no spec on using duplicate query parameters。但是,在尝试检索它们时,您可以清楚地看到问题;你在PHP中使用$_GET
,在JavaScript,Node.js等中遇到这个。
我建议你是否可以使用管道或逗号分隔做一些事情:storeIds=abc,xyz
。然后使用ExtractVariables策略提取查询参数,您将执行以下操作:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<ExtractVariables async="false" continueOnError="true" enabled="true" name="productsVariables">
<DisplayName>Extract</DisplayName>
<URIPath>
<QueryParam name="storeIds">
<Pattern ignoreCase="true">{storeIdsArray}</Pattern>
</QueryParam>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>
在您的javascript中,您可以执行以下操作:
try {
var storeIdsArray = context.getVariable('storeIdsArray').split(',');
storeIdsArray.forEach(function(storeId) {
// do something with storeId
}
}
catch (e) {
// storeIdsArray wasn't defined or not an array or something else went wrong
}
答案 1 :(得分:1)
在原始CGI中,您可以使用相同的查询参数在NULL上拆分多个值,但在Apigee中,到达消息处理器时,queryparam仅包含第一个值。因此,唯一的方法是使用完整的message.querystring进行暴力破解。
如果我寄出:
testme?myQueryParam=Y&myQueryParam=X
我必须使用JavaScript进行双重拆分并循环执行每个查询参数:
var text = "";
var myQueryParams = context.getVariable('message.querystring');
var myQueryParamArray = myQueryParams.split(/\&/);
for (i = 0; i < myQueryParamArray.length; i++) {
var myvals = myQueryParamArray[i].split(/\=/);
text += myvals[1] + ", ";
}
context.setVariable('mytext', text);
在这个例子中,我创建了一个名为mytext的变量,其值为&#34; X,Y,&#34;