2017-04-03 17 views
0

最終的なエンドポイントが受け取ろうとしているものとは異なるJSON入力オブジェクトを基本的に期待するプロキシを構築しました。そのため、要求オブジェクトを一方から他方にブリッジするために、私はAssingMessageポリシーを使用してjson入力を変換しています。APIGEEのJSON AssignMessageペイロードでnull値を省略する方法は?

私はこのような何かをやっている:

<?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ポリシーで選択される別の変数に格納します。

ジャバスクリプトポリシー:

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> 

このソリューションを私のためにうまくいった。他の誰かが助けてくれることを願っています。

関連する問題