Как использовать один и тот же поток для запроса и ответа для прокси Apigee?

Для прокси API Apigee мне нужно выбрать поток на основе параметра запроса. Но мне также нужно удалить этот параметр перед отправкой запроса на цель.

Я пытался сделать это:

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

person Victor Lyuboslavsky    schedule 24.01.2015    source источник


Ответы (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>

Затем я выполняю политику restoreVars на первом этапе ответа postFlow. Таким образом, я могу использовать эти переменные в качестве условий. Вот политика восстановления:

<?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>

В вашем случае вы должны «спрятать» свой параметр запроса прямо перед тем, как удалить его как параметр запроса.

Второй подход заключается в том, чтобы просто присвоить параметр запроса другой переменной, переменной с пользовательской меткой, к которой можно получить доступ на протяжении всего потока. Единственная проблема с этим подходом заключается в том, что источник этих скопированных переменных не является очевидным для более поздних потоков.

person David Allen - Apigeek    schedule 25.01.2015