对于Apigee API代理,我需要根据请求参数选择流。但是我还需要在将请求发送到目标之前删除该参数。
我试过这样做:
<Flow name="SpecialFlow">
<Condition>request.queryparam.specialKey != null</Condition>
<Request>
<Step>
<Name>removeSpecialKey</Name>
</Step>
</Request>
<Response>
<Step><Name>doSpecialStuff</Name></Step>
</Response>
</Flow>
但是,由于删除了specialKey
,因此永远不会调用响应步骤doSpecialStuff
。在这种情况下,如何确保同一流程用于请求和响应?
我删除了如下参数:
context.removeVariable('request.queryparam.specialKey');
答案 0 :(得分:1)
很棒的问题和常见的情况。在我的代理中,我使用两种策略之一。
在我前往目标流之前的第一个我是saveVars策略,通常作为预流请求的最后一步。该政策如下:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="true" enabled="true" name="assignSaveMessage">
<DisplayName>assignSaveMessage</DisplayName>
<AssignVariable>
<Name>save.request.verb</Name>
<Ref>request.verb</Ref>
</AssignVariable>
<AssignVariable>
<Name>save.request.queryparam.content</Name>
<Ref>request.queryparam.content</Ref>
</AssignVariable>
<AssignVariable>
<Name>save.request.content</Name>
<Ref>request.content</Ref>
</AssignVariable>
<AssignVariable>
<Name>save.request.queryparam.propagation</Name>
<Ref>request.queryparam.propagation</Ref>
</AssignVariable>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>
然后我在postFlow响应的第一步执行restoreVars策略。这样我可以将这些变量用作条件。以下是恢复政策:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="true" enabled="true" name="assignRestoreMessage">
<DisplayName>assignRestoreMessage</DisplayName>
<AssignVariable>
<Name>request.verb</Name>
<Ref>save.request.verb</Ref>
</AssignVariable>
<AssignVariable>
<Name>request.queryparam.content</Name>
<Ref>save.request.queryparam.content</Ref>
</AssignVariable>
<AssignVariable>
<Name>request.queryparam.propagation</Name>
<Ref>save.request.queryparam.propagation</Ref>
</AssignVariable>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>
在您的情况下,您可以在将查询参数作为查询参数删除之前“隐藏”您的查询参数。
第二种方法是简单地将请求参数分配给另一个变量,一个可以在整个流程中访问的自定义标记变量。这种方法唯一需要关注的是这些复制变量的来源后期流量并不明显。