如何在APIGEE中省略JSON AssignMessage有效负载中的空值?

时间:2017-04-03 15:33:15

标签: apigee

我构建了一个代理,它基本上需要一个不同于最终端点期望接收的JSON输入对象。因此,为了将请求对象从一个桥接到另一个,我使用AssingMessage策略来转换json输入。

我做这样的事情:

<Payload contentType="application/json">
    {   
    <skip-if-empty name="clientrequest.valueA">
        "valueA": "{clientrequest.valueA}",
    </skip-if-empty>
        "valueB": "{clientrequest.valueB}",
        ...
    }
</Payload>

当某些值为空时出现问题。目标服务器无法正确处理任何空值(从我的控件中转义)。

我的问题是:如果值为空,如何完全跳过参数?

我正在寻找类似的东西(或更好的选择):

ck-editor 4.6.2

1 个答案:

答案 0 :(得分:0)

对于我在研究中发现的内容,似乎这是Javascript策略的工作。

这是怎么做到的?

您基本上需要在AssignMessage执行之前放置一个JavaScript策略。在javascript策略中,如果未提供值,您可以自由地应用所有逻辑来省略某些参数。

例如,假设我们已经使用ExtractVariables策略将请求值提取到变量。然后,在Javascript策略中,我们可以验证这些值并构建生成的JSON对象,以便稍后将其存储在将由AssingMessage策略获取的另一个变量中。

javascript政策:

var valueA = context.getVariable("clientrequest.valueA"),
valueB = context.getVariable("clientrequest.valueB"),
valueC = context.getVariable("clientrequest.valueC"),
...

var result = {};

if(valueB) {
    result.b = valueB;
}
if(valueA) {
    result.a = valueA;
}
if(valueC) {
    result.c = valueC;
}
...

context.setVariable("newInput", JSON.stringify(result));

然后我们的AssignMessage将只选择我们刚刚存储的变量:“newInput”将包含完整的JSON对象字符串:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-Sample">
    <DisplayName>Assign Message-Sample</DisplayName>
    <Remove>
        <Headers>
            <Header name="login_id"/>
            <Header name="Authorization"/>
        </Headers>
        <Payload>true</Payload>
    </Remove>
    <Set>
        <Payload contentType="application/json">
    {newInput}
        </Payload>
        <Verb>POST</Verb>
    </Set>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

这个解决方案对我来说很好。我希望其他人觉得它有用。