Устранение ошибок во время выполнения извлечения переменных

Вы просматриваете документацию Apigee Edge .
Перейдите к документации Apigee X.
информация

Исходное сообщениенедоступно

Код ошибки

steps.extractvariables.SourceMessageNotAvailable

Тело ответа об ошибке

{
  "fault": {
      "faultstring": "[variable_name] message is not available for ExtractVariable: [policy_name]",
      "detail": {
          "errorcode": "steps.extractvariables.SourceMessageNotAvailable"
      }
  }
}

Причина

Эта ошибка возникает, если переменная сообщения , указанная в элементе <Source> политики извлечения переменных :

  • вне области действия (недоступно в конкретном потоке, в котором выполняется политика) или
  • не может быть решено (не определено)

Например, эта ошибка возникает, если политика извлечения переменных выполняется в потоке запросов, но элементу <Source> присвоена переменная response или error , которой не существует в потоке запросов.

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка, и имя недоступной переменной. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующей строке ошибки имя политики — ExtractVariables-1 , а переменная — response :

    "faultstring": "response message is not available for ExtractVariable: ExtractVariables-1"

  2. В неудавшемся XML-файле политики извлечения переменных убедитесь, что имя переменной, установленной в элементе, соответствует имени переменной, указанной в строке ошибки (шаг № 1 выше). Например, следующая политика извлечения переменных определяет в элементе переменную с именем response , которая соответствует значению в строке ошибки:

    <ExtractVariables name="ExtractVariables-1">
        <Source>response</Source>
        <URIPath>
            <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
        </URIPath>
        <VariablePrefix>urirequest</VariablePrefix>
    </ExtractVariables>
    
  3. Определите, определена ли переменная, используемая в элементе <Source> , и доступна ли она в потоке, в котором выполняется политика извлечения переменных.

  4. Если переменная:

    • вне области действия (недоступно в конкретном потоке, в котором выполняется политика) или
    • не может быть решено (не определено)

    тогда это причина ошибки.

    В качестве примера предположим, что политика извлечения переменных, показанная выше, выполняется в потоке запросов . Напомним, что переменная response используется в элементе <Source> политики извлечения переменных. Переменная response доступна только в потоке ответов.

    Поскольку переменная response не существует в потоке запроса, вы получаете код ошибки: steps.extractvariables.SourceMessageNotAvailable .

Разрешение

Убедитесь, что переменная, установленная в элементе <Source> неудачной политики извлечения переменных, определена и существует в потоке, в котором выполняется политика.

Чтобы исправить приведенный выше пример политики извлечения переменных, вы можете изменить элемент <Source> , чтобы использовать переменную request в том виде, в котором она существует в потоке запроса:

<ExtractVariables name="ExtractVariables-1">
    <Source>request</Source>
    <URIPath>
        <Pattern ignoreCase="true">/a/{pathSeg}</Pattern>
    </URIPath>
    <VariablePrefix>urirequest</VariablePrefix>
</ExtractVariables>

SetVariableFailed

Код ошибки

steps.extractvariables.SetVariableFailed

Тело ответа об ошибке

{
    "fault": {
        "faultstring": "Failed to set variable [variable_name] value [variable_value] from ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.SetVariableFailed"
        }
    }
}

Причина

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

Например, предположим, что вы создаете/присвояете значение переменной var.color . В этом случае color выделяется как узел объекта. Если вы затем попытаетесь присвоить значение другой переменной var.color.next , это не удастся, поскольку color уже выделен, и ему не разрешено присваивать ему другую переменную.

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка, и имя переменной, для которой не удалось установить значение. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующей строке ошибки имя политики — ExtractColors , а переменная — var.color.next :

    "faultstring": "Failed to set variable var.color.next value red from ExtractVariables: ExtractColors"

  2. В неудавшемся XML-файле политики извлечения переменных убедитесь, что имя переменной соответствует имени переменной, указанному в строке ошибки (шаг № 1 выше). Например, следующая политика пытается присвоить значение из параметра запроса запроса переменной с именем var.color.next (значение, которое отображается в строке ошибки):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractColors">
        <DisplayName>ExtractColors</DisplayName>
        <Source>request</Source>
        <QueryParam name="color">
            <Pattern ignoreCase="true">{color}</Pattern>
        </QueryParam>
        <QueryParam name="nextcolor">
            <Pattern ignoreCase="true">{color.next}</Pattern>
        </QueryParam>
        <VariablePrefix>var</VariablePrefix>
    </ExtractVariables>
    
  3. Проверьте все имена переменных, использованные в неудачной политике извлечения переменных. Если вы присвоили значение другой переменной, имя которой начинается с того же имени, что и имя переменной, указанное в строке ошибки (шаг № 1 выше), то это и есть причина ошибки.

    В примере политики извлечения переменных, показанном выше, обратите внимание на следующее:

    • Значение параметра запроса с именем color сначала присваивается переменной var.color ( Примечание: var — это префикс для всех переменных, заданных в элементе <VariablePrefix> )
    • В следующем присваивании значение параметра запроса nextcolor присваивается другой переменной var.color.next .
    • Поскольку var.color уже выделена, политика извлечения переменных не может выделить другую вложенную переменную var.color.next . Итак, вы получаете код ошибки: steps.extractvariables.SetVariableFailed

Разрешение

  1. Убедитесь, что у вас нет нескольких имен переменных, имена которых начинаются с одних и тех же слов, вложенных в формат, разделенный точками.

    Чтобы исправить политику извлечения переменных, показанную выше, вы можете изменить имя переменной var.color.next , чтобы использовать имя переменной var.nextcolor.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractColors">
        <DisplayName>ExtractColors</DisplayName>
        <Source>request</Source>
        <QueryParam name="color">
            <Pattern ignoreCase="true">{color}</Pattern>
        </QueryParam>
        <QueryParam name="nextcolor">
            <Pattern ignoreCase="true">{nextcolor}</Pattern>
        </QueryParam>
        <VariablePrefix>var</VariablePrefix>
    </ExtractVariables>
    
    

Дополнительная информация

Более подробную информацию можно найти в этой публикации сообщества .

Неверный путьJSONPath

Код ошибки

steps.extractvariables.InvalidJSONPath

Тело ответа об ошибке

{
    "fault": {
        "faultstring": "Invalid JSON path [path_name] in policy [policy_name].",
        "detail": {
            "errorcode": "steps.extractvariables.InvalidJSONPath"
        }
    }
}

Причина

Эта ошибка возникает, если в элементе <JSONPath> политики извлечения переменных используется недопустимый путь JSON. Например, если полезные данные JSON не имеют объекта Name , но вы указываете Name в качестве пути в политике извлечения переменных, возникает эта ошибка.

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка, и недопустимый путь JSON. Оба этих элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующей строке ошибки имя политики — ExtractJSONVariables , а недопустимый путь JSON — $.Name :

    "faultstring": "Invalid JSON path $.Name in policy ExtractJSONVariables."

  2. В неудавшемся XML-файле политики извлечения переменных убедитесь, что путь JSON, заданный в элементе <JSONPath> , соответствует пути, указанному в строке ошибки (шаг № 1 выше). Например, следующая политика извлечения переменных указывает путь JSON $.Name , который соответствует тому, что указано в строке ошибки:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>response</Source>
        <JSONPayload>
            <Variable name="name" type="string">
                <JSONPath>$.Name</JSONPath>
            </Variable>
        </JSONPayload>
       <VariablePrefix>employee</VariablePrefix>
    </ExtractVariables>
    
  3. Изучите элемент <Source> и определите, из какой полезной нагрузки JSON вы пытаетесь извлечь переменную. Например, если для элемента <Source> установлено значение request , политика извлекает полезную нагрузку JSON из объекта запроса. Если для него установлено response , то это будет объект ответа.

    В примере политики извлечения переменных, показанном выше, элементу <Source> присвоено значение response , поэтому переменные извлекаются из полезных данных JSON ответа.

    <Source>response</Source>

  4. Проверьте соответствующие полезные данные JSON (определенные на шаге 3) и проверьте, есть ли у них объект, указанный в элементе <JSONPath> . Если в полезных данных JSON нет этого объекта, это и есть причина ошибки.

    В качестве примера предположим, что вы пытаетесь извлечь переменные из следующих полезных данных ответа JSON:

    {
      "firstName":"John",
      "lastName":"Doe",
      "city":"San Jose",
      "state":"CA"
    }
    

    Поскольку полезные данные ответа JSON не содержат объекта Name , политика извлечения переменных завершается с ошибкой, и вы получаете код ошибки: steps.extractvariables.InvalidJSONPath .

Разрешение

  1. Убедитесь, что в элементе <JSONPath> политики извлечения переменных указаны только объекты, являющиеся частью полезных данных JSON, из которых извлекаются переменные.

    Чтобы исправить приведенный выше пример политики извлечения переменных, вы можете изменить элемент <JSONPath> , указав один из объектов, доступных в образце полезных данных ответа JSON (например, допустимы объекты firstName и lastName ):

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>response</Source>
        <JSONPayload>
            <Variable name="name" type="string">
                <JSONPath>$.firstName</JSONPath>
            </Variable>
        </JSONPayload>
       <VariablePrefix>employee</VariablePrefix>
    </ExtractVariables>
    
    

Выполнение не удалось

Код ошибки

steps.extractvariables.ExecutionFailed

Тело ответа об ошибке

{
    "fault": {
        "faultstring": "Failed to execute the ExtractVariables: [policy_name]",
        "detail": {
            "errorcode": "steps.extractvariables.ExecutionFailed"
        }
    }
}

Возможные причины

Возможные причины этой ошибки:

Причина Описание
Отсутствуют входные полезные данные Входные полезные данные (JSON, XML) пусты.
Неверный или неверный ввод Входные данные (JSON, XML и т. д.), переданные в политику, недействительны или имеют неверный формат.

Причина: отсутствуют входные полезные данные.

Если политика «Извлечение переменных» предполагает извлечение переменных из полезных данных JSON или XML, но содержимое (полезная нагрузка) переменной, указанной в элементе <Source> , пусто, возникает эта ошибка.

Например, если элемент <Source> в политике извлечения переменных установлен как request или response и они должны содержать полезную нагрузку JSON или XML, но эта полезная нагрузка пуста, возникает ошибка.

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка. Эту информацию можно найти в элементе errorstring ответа об ошибке. Например, в следующей строке ошибки имя политики — ExtractJSONVariables :

    "faultstring": "Failed to execute the ExtractVariables: ExtractXMLVariables"

  2. Проверьте элемент <Source> в ошибочном XML-коде Extract Variables и определите тип входных данных, из которых извлекаются переменные. Например, в следующей политике извлечения переменных элемент <Source> установлен на response и извлекает переменные из полезных данных XML:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractXMLVariables" async="false" continueOnError="false" enabled="true">
        <XMLPayload>
            <Namespaces/>
            <Variable name="City" type="string">
                <XPath>/city</XPath>
            </Variable>
        </XMLPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. Проверьте, не являются ли входные данные, анализируемые политикой извлечения переменных, пустыми. Если ввод пуст, то это причина ошибки.

    В примере политики извлечения переменных, показанном выше, полезные данные ответа (т. е. тело ответа), отправленные внутренним сервером, были пустыми.

    Поскольку полезные данные ответа XML пусты, вы получаете код ошибки:

    steps.extractvariables.ExecutionFailed

    Эта ошибка также может возникнуть, если для элемента <Source> установлено значение request , но в запросе прокси API не передается никакая полезная нагрузка. Например:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/xml"
    

    Политика извлечения переменных выполняет извлечение XML только в том случае, если заголовок Content-Type сообщения имеет значение application/xml , text/xml или application/*+xml . Вы должны передать заголовок Content-Type как application/xml , text/xml или application/*+xml если хотите, чтобы политика извлечения переменных анализировала полезные данные XML-запроса.

Разрешение

Убедитесь, что входные данные, переданные в политику извлечения переменных, действительны и не пусты.

Чтобы устранить проблему с примером политики извлечения переменных, показанным выше, передайте допустимые полезные данные XML. Например:

  1. Создайте файл city.xml со следующим содержимым:

    <city>Bengaluru</city>
    <area>Sanjaynagar</area>
    
  2. Выполните вызов API с помощью команды cURL следующим образом:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/xml" -X POST -d @city.xml
    
    

Причина: неверный или неправильный ввод.

Если политика извлечения переменных анализирует недопустимые или неправильно сформированные входные данные, вы получаете эту ошибку.

Например, если в качестве входных данных для политики извлечения переменных указан следующий недопустимый JSON, вы получите эту ошибку.

[
    "args": ["name" : "amar" ]
]

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующей faultstring имя политики — ExtractJSONVariables :

    "faultstring": "Failed to execute the ExtractVariables: ExtractJSONVariables"

  2. Проверьте элемент <Source> в ошибочном XML-коде Extract Variables и определите тип входных данных, из которых извлекаются переменные. Например, в следующей политике извлечения переменных элемент <Source> настроен на request и извлекает переменные из полезных данных JSON:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request</Source>
    </ExtractVariables>
    
    
  3. Проверьте, действительны ли входные данные, анализируемые политикой извлечения переменных. Если ввод недействителен или неверен, это и есть причина ошибки.

    В примере политики извлечения переменных, показанном выше, в политику извлечения переменных был передан следующий недопустимый JSON.

    [
        "args": ["name" : "amar" ]
    ]
    

    Вот пример вызова API, показывающий, как был передан запрос:

    curl -v "http://<org>-<env>.apigee.net/v1/testevexecutionfailed" -H "Content-Type: application/json" -X POST -d '[ "args" : ["name" : "amar" ]]'
    

    Полезная нагрузка JSON, переданная в API, недействительна, поскольку она содержит массив с квадратными скобками ( [ ] ), поэтому вы получаете код ошибки:

    steps.extractvariables.ExecutionFailed
    

    Эта ошибка также может возникнуть, если для элемента <Source> установлено значение response , но полезные данные ответа JSON недействительны или имеют неправильный формат.

Разрешение

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

Чтобы устранить проблему с примером политики извлечения переменных, описанной выше, передайте действительный запрос полезных данных JSON следующим образом:

{
   "args":{
      "name":"amar"
   }
}

НеаблеТоКаст

Код ошибки

steps.extractvariables.UnableToCast

Тело ответа об ошибке

{
    "fault": {
        "faultstring": "Unable to cast value [value] as [type].",
        "detail": {
            "errorcode": "steps.extractvariables.UnableToCast"
        }
    }
}

Причина

Эта ошибка возникает, если политике извлечения переменных не удалось преобразовать извлеченное значение в переменную. Обычно это происходит, если вы пытаетесь установить значение одного типа данных в переменную другого типа данных.

Например, если политика «Извлечение переменной» попытается установить значение, извлеченное из строковой переменной, в целочисленную переменную, вы увидите эту ошибку.

Диагностика

  1. Определите тип данных переменной, к которой политика извлечения переменных пытается выполнить преобразование, но терпит неудачу. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующей faultstring тип объекта — BOOLEAN :

    "faultstring":"Unable to cast value 36.231 as BOOLEAN."

  2. Определите политику извлечения переменных, в которой вы пытаетесь установить значение переменной типа, определенного на шаге 1.

    Например, следующая политика извлечения переменных извлекает значение из JSONPath $.latitude в переменную типа boolean , которая соответствует значению в строке ошибки:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
          <Variable name="latitude" type="boolean">
              <JSONPath>$.latitude</JSONPath>
          </Variable>
        </JSONPayload>
        <Source clearPayload="false">response</Source>
    </ExtractVariables>
    
    
  3. Проверьте тип данных извлекаемого значения. Данные могут быть в форме заголовков, путей URI, полезных данных JSON/XML, параметров формы и параметров запроса.

  4. Убедитесь, что тип данных, определенный на шаге №3, и тип данных переменной, которой назначаются данные (определенный на шаге №2), совпадают.

  5. Если тип данных переменных источника и назначения не совпадает, это и есть причина ошибки.

    В примере политики извлечения переменных, показанном выше, рассмотрим полезную нагрузку запроса JSON следующим образом:

    {
     "latitude":36.2312
    }
    

    Тип данных значения, извлекаемого из <JSONPath> , '$.latitude' , является целым числом, которое присваивается переменной типа данных boolean.

    Поскольку тип данных извлеченного значения и тип данных переменной, которой присваивается значение, не совпадают, вы получаете код ошибки: steps.extractvariables.UnableToCast .

Разрешение

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

Чтобы исправить пример политики извлечения переменных, вам необходимо изменить тип переменной на Integer:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="EV-XML-Name" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="latitude" type="integer">
            <JSONPath>$.latitude</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response</Source>
</ExtractVariables>

JsonPathParsingFailure

Код ошибки

steps.extractvariables.JsonPathParsingFailure

Тело ответа об ошибке

{
    "fault": {
        "faultstring": "ExtractVariables [policy_name]: Json path parsing failed for flow variables [variable_name]",
        "detail": {
            "errorcode": "steps.extractvariables.JsonPathParsingFailure"
        }
    }
}

Причина

Эта ошибка возникает, когда политика извлечения переменных не может проанализировать путь JSON и извлечь данные из переменной потока, указанной в элементе <Source> . Обычно это происходит, если переменная потока, указанная в элементе <Source> , не существует в текущем потоке.

Например, эта ошибка возникает, если политика извлечения переменных выполняется в потоке ответов и ожидается, что она будет анализировать путь JSON, но элемент <Source> указывает переменную потока request.content , которая не существует в потоке ответов.

Диагностика

  1. Определите политику извлечения переменных, в которой произошла ошибка, и имя переменной потока, в которую не удалось извлечь данные. Оба эти элемента можно найти в элементе errorstring ответа об ошибке. Например, в следующей строке ошибки имя политики — ExtractVariables-1 , а переменная — request.content :

    "faultstring": "ExtractVariables ExtractJSONVariabes: Json path parsing failed for flow variables request.content"

  2. В неудавшемся XML-файле политики извлечения переменных убедитесь, что имя переменной, установленной в элементе <Source> , соответствует имени переменной, указанной в строке ошибки (шаг № 1 выше). Например, следующая политика извлечения переменных определяет переменную с именем request.content , которая соответствует значению в строке ошибки:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
        <JSONPayload>
            <Variable name="Name" type="string">
                <JSONPath>$.args.name</JSONPath>
            </Variable>
        </JSONPayload>
        <Source clearPayload="false">request.content</Source>
    </ExtractVariables>
    
    
  3. Убедитесь, что переменная потока, используемая в элементе <Source> , определена и доступна в потоке, в котором выполняется политика извлечения переменных.

  4. Если переменная:

    • вне области действия (недоступно в конкретном потоке, в котором выполняется политика) или
    • не может быть решено (не определено)

    тогда это причина ошибки.

    В качестве примера предположим, что политика ExtractVariables, показанная выше, должна выполняться в потоке ответов. Напомним, что переменная потока request.content используется в элементе <Source> политики извлечения переменных. Переменная потока request.content доступна только в потоке запросов.

    Поскольку переменная response не существует в потоке запроса, вы получаете код ошибки: steps.extractvariables.JsonPathParsingFailure .

Разрешение

Убедитесь, что переменная потока, используемая в элементе <Source> политики извлечения переменных, доступна в потоке, в котором выполняется политика извлечения переменных.

Например, предположим, что переменная с именем response.content существует в потоке ответов и фактически содержит JSON, который вы хотите извлечь. Чтобы исправить политику извлечения переменных, показанную выше, вы можете изменить элемент <Source> следующим образом:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables name="ExtractJSONVariables" async="false" continueOnError="false" enabled="true">
    <JSONPayload>
        <Variable name="Name" type="string">
            <JSONPath>$.args.name</JSONPath>
        </Variable>
    </JSONPayload>
    <Source clearPayload="false">response.content</Source>
</ExtractVariables>