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

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

SourceMessageNotAvailable

Код ошибки

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 сообщения об ошибке. Например, в следующем примере 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>
    
    

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

Для получения более подробной информации обратитесь к этому сообщению на форуме .

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 в качестве пути в политике извлечения переменных, то возникает эта ошибка.

Диагноз

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

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

  2. Изучите элемент <Source> в XML-файле, используемом для извлечения переменных, и определите тип входных данных, из которых извлекаются переменные. Например, в следующей политике извлечения переменных элемент <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 . Для того чтобы политика «Извлечение переменных» могла анализировать полезную нагрузку 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. Проверьте, является ли входной сигнал, обрабатываемый политикой извлечения переменных, допустимым. Если входной сигнал недопустим или имеет неправильный формат, это и является причиной ошибки.

    В приведенном выше примере политики извлечения переменных в политику извлечения переменных был передан следующий недопустимый 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" ]]'
    

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

    steps.extractvariables.ExecutionFailed
    

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

Разрешение

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

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

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

UnableToCast

Код ошибки

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' — целое число, которое присваивается переменной логического типа.

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

Разрешение

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

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

<?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. Укажите политику извлечения переменных, в которой произошла ошибка, и имя переменной потока, в которую не удалось извлечь данные. Оба эти элемента можно найти в элементе faultstring ответа об ошибке. Например, в следующем примере faultstring имя политики — 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>