2017-04-03 119 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> 

該解決方案爲我工作得很好。我希望別人認爲它有幫助。