2017-04-03 113 views
0

我构建了一个基本上期望不同于最终端点期望接收的JSON输入对象的代理。因此,为了将请求对象从一个连接到另一个,我使用AssingMessage策略来转换json输入。如何在APIGEE中忽略JSON AssignMessage载荷中的空值?

我在做这样的事情:

<?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"> 
    {   
     "valueA": "{clientrequest.valueA}", 
     "valueB": "{clientrequest.valueB}", 
     "valueC": "{clientrequest.valueC}", 
     "valueD": "{clientrequest.valueD}", 
     "valueE": "{clientrequest.valueE}", 
     "valueF": "{clientrequest.valueF}", 
    } 
     </Payload> 
     <Verb>POST</Verb> 
    </Set> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> 
    <AssignTo createNew="false" transport="http" type="request"/> 
</AssignMessage> 

问题是当某些值是空的。目标服务器不能正确处理任何空值(从我的控制中转义)。

我的问题是:如果值为空,我怎样才能完全跳过一个参数?

我正在寻找这样的事情(或更好的选择):

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

回答

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将刚捡到的时候,我们刚刚存储的变量:将包含完整的JSON对象字符串 “newInput”:

<?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> 

该解决方案为我工作得很好。我希望别人认为它有帮助。