如何对 Apigee 代理的请求和响应使用相同的流程?

How to use the same Flow for request and response for Apigee proxy?

对于 Apigee API 代理,我需要 select 基于请求参数的流。但是我还需要在将请求发送到目标之前删除该参数。

我试过这样做:

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

好问题和常见场景。在我的代理中,我使用两种策略之一。

首先,我在前往目标流之前执行了 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>

在你的情况下,你会 "stash" 你的查询参数,然后再将其作为查询参数删除。

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