【问题标题】:How to collect values for multi-valued queryparam in apigee?如何在 apigee 中收集多值查询参数的值?
【发布时间】:2014-10-17 04:51:25
【问题描述】:

对于具有多值查询参数的请求,例如: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循环的第一行

更新 #2:

所以有了这个context.proxyRequest.queryParams['storeIds'].length() 就可以了!至少在javascript中......我仍然不知道如何通过提取变量策略来做到这一点......

【问题讨论】:

    标签: apigee


    【解决方案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
    }
    

    【讨论】:

    • 我喜欢!但是 javasrcipt 再次参与其中。我想再等一会儿,让 apigee 中的某个人告诉我,在接受您的答案作为事实上的答案之前,这是不可能通过 xml/policy 实现的 :)
    • 我试过了,但它在政策中不起作用;)最好我能说它不起作用。
    【解决方案2】:

    在原始 CGI 中,您可以在 NULL 上使用相同的 queryparam 拆分多个值,但在 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 的变量,其值为“X, Y”

    【讨论】:

      猜你喜欢
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2021-02-10
      相关资源
      最近更新 更多