如何为Apigee代理使用相同的Flow请求和响应?

时间:2015-01-24 23:15:57

标签: apigee

对于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');

1 个答案:

答案 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>

在您的情况下,您可以在将查询参数作为查询参数删除之前“隐藏”您的查询参数。

第二种方法是简单地将请求参数分配给另一个变量,一个可以在整个流程中访问的自定义标记变量。这种方法唯一需要关注的是这些复制变量的来源后期流量并不明显。