如何在apigee中收集多值查询参数的值?

时间:2014-10-16 04:41:09

标签: apigee

对于具有多值查询参数的请求,例如: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['storeIds'].length()就行了!至少在javascript中......我仍然不知道如何通过提取变量策略来实现这一点......

2 个答案:

答案 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;