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

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

SourceMessageNotAvailable

Код ошибки

steps.extractvariables.SourceMessageNotAvailable

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

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

Причина

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

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

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

диагностика;

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

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

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

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

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

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

    то это и есть причина ошибки.

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

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

Разрешение

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

Чтобы исправить приведенный выше пример правила Extract Variables, можно изменить элемент <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"
        }
    }
}

Причина

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

Например, вы создаете переменную 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. Проверьте все названия переменных, использованные в правиле Extract Variables, которое не удалось выполнить. Если вы присвоили значение другой переменной, название которой начинается так же, как и название переменной, указанное в строке ошибки (шаг 1 выше), то это и является причиной ошибки.

    В примере правил извлечения переменных выше:

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

Разрешение

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

    Чтобы исправить правило Extract Variables, показанное выше, можно изменить название переменной 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>
    
    

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

Подробнее о новых требованиях…

InvalidJSONPath

Код ошибки

steps.extractvariables.InvalidJSONPath

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

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

Причина

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

диагностика;

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

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

  2. В XML-файле правила Extract Variables, которое не удалось выполнить, убедитесь, что путь 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, из которой извлекаются переменные.

    Чтобы исправить приведенный выше пример правила Extract Variables, можно изменить элемент <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>
    
    

ExecutionFailed

Код ошибки

steps.extractvariables.ExecutionFailed

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

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

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

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

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

Причина: отсутствует входная полезная нагрузка

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

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

диагностика;

  1. Определите правило извлечения переменных, в котором произошла ошибка. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в приведенной ниже строке ошибки название правила – 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. Проверьте, не является ли пустым входной параметр, который обрабатывается правилом Extract Variables. Если входные данные отсутствуют, это и будет причиной ошибки.

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

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

    steps.extractvariables.ExecutionFailed

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

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

    Правило Extract Variables извлекает XML-код, только если заголовок Content-Type сообщения имеет значение application/xml, text/xml или application/*+xml. Чтобы правило Extract Variables могло анализировать полезную нагрузку XML-запроса, необходимо передать заголовок Content-Type как application/xml, text/xml или application/*+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-файле, в котором не удалось извлечь переменные, и определите тип входных данных, из которых извлекаются переменные. Например, в следующем правиле извлечения переменных элемент <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. Проверьте, действителен ли входной параметр, который анализируется правилом Extract Variables. Если входные данные недействительны или имеют неверный формат, это и будет причиной ошибки.

    В примере выше в правило Extract Variables был передан следующий недопустимый код 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 недействительна или имеет неверный формат.

Разрешение

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

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

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

UnableToCast

Код ошибки

steps.extractvariables.UnableToCast

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

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

Причина

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

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

диагностика;

  1. Определите тип данных переменной, к которой пытается привести значение правило Extract Variables, но не может этого сделать. Эту информацию можно найти в элементе 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. Если типы данных исходной и целевой переменных не совпадают, это может быть причиной ошибки.

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

    {
     "latitude":36.2312
    }
    

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

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

Разрешение

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

Чтобы исправить пример политики Extract Variables, нужно изменить тип переменной на 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>, не существует в текущем потоке.

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

диагностика;

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

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

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

    <?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, который вы хотите извлечь. Чтобы исправить правило ExtractVariables, показанное выше, можно изменить элемент <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>