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

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

SourceUnavailable

Код ошибки

steps.xml2json.SourceUnavailable

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

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Source [source_variable] is not available",
        "detail": {
            "errorcode": "steps.xmltojson.SourceUnavailable"
        }
    }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "XMLToJSON[Convert-XMLToJSON]: Source response is not available",
        "detail": {
            "errorcode": "steps.xml2json.SourceUnavailable"
        }
    }
}

Причина

Эта ошибка возникает, если переменная message или строковая переменная, указанная в элементе <Source> правила XML в JSON, является:

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

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

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

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

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Source response is not available"
    
  2. В XML-файле правил, который не удалось преобразовать из XML в JSON, убедитесь, что название переменной, заданной в элементе <Source>, совпадает с названием переменной, указанным в строке ошибки (шаг 1 выше). Например, в приведенном ниже правиле преобразования XML в JSON в элементе <Source> задана переменная response, которая соответствует элементу faultstring:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>response</OutputVariable>
        <Source>response</Source>
    </XMLToJSON>
    
  3. Определите, задана ли переменная, используемая в элементе <Source>, и доступна ли она в потоке, в котором выполняется правило XML в JSON.

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

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

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

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

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

    steps.xml2json.SourceUnavailable
    

Разрешение

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

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
    <DisplayName>Convert-XMLToJSON</DisplayName>
    <Properties/>
    <Format>google</Format>
    <OutputVariable>response</OutputVariable>
    <Source>request</Source>
</XMLToJSON>

ExecutionFailed

Код ошибки

steps.xml2json.ExecutionFailed

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

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Execution failed. reason: Premature end of document while parsing at line [line_number](possibly  around char [character_number])",
        "detail": {
            "errorcode": "steps.xml2json.ExecutionFailed"
        }
    }
}

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

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

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

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

В правиле преобразования XML в JSON возникает ошибка, если контент (полезная нагрузка) переменной, указанной в элементе <Source>, пуст.

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

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

  1. Определите правило преобразования XML в JSON, в котором произошла ошибка. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующем фрагменте кода faultstring название правила – Convert-XMLToJSON:

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 1(possibly  around char 0)"
    
  2. Проверьте элемент <Source> в XML-файле правил, который не удалось преобразовать в JSON, и определите указанную переменную. Например, в следующем правиле преобразования XML в JSON элемент <Source> имеет значение request:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Options>
            <RecognizeNumber>true</RecognizeNumber>
            <RecognizeBoolean>true</RecognizeBoolean>
            <RecognizeNull>true</RecognizeNull>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>request</Source>
    </XMLToJSON>
    
  3. Проверьте, не является ли переменная, указанная для элемента <Source> в правиле XMLToJSON, пустой. Если он пуст, то это и есть причина ошибки.

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

    Пример:

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

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

    steps.xml2json.ExecutionFailed
    

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

Разрешение

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

Чтобы устранить проблему с примером правил XML в JSON, передайте действительную полезную нагрузку XML. Пример:

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

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    </root>
    
  2. Выполните вызов API с помощью команды cURL, как показано ниже:

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

Причина: недействительный или неправильный входной запрос

Эта ошибка возникает, если правило XML в JSON обрабатывает недопустимый или неправильно отформатированный входной файл.

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

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <City>Bengaluru</City>
   <Name>Apigee</Name>
   <Pincode>560016</Pincode>

появится ошибка:

"faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 6(possibly  around char 0)"

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

  1. Определите правило преобразования XML в JSON, в котором произошла ошибка. Эту информацию можно найти в элементе faultstring ответа об ошибке. Например, в следующем фрагменте кода faultstring название правила – Convert-XMLToJSON:

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Execution failed. reason: Premature end of document while parsing at line 6(possibly  around char 0)"
    
  2. Проверьте элемент <Source>, указанный в XML-файле правил, который не удалось преобразовать в JSON. Например, в следующем правиле преобразования XML в JSON элемент <Source> имеет значение переменной request:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
        <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Options>
            <RecognizeNumber>true</RecognizeNumber>
            <RecognizeBoolean>true</RecognizeBoolean>
            <RecognizeNull>true</RecognizeNull>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>request</Source>
    </XMLToJSON>
    
  3. Проверьте, является ли входное значение, указанное в элементе <Source> для правила "XML в JSON", допустимой полезной нагрузкой XML. Если входные данные недействительны или имеют неверный формат, это и будет причиной ошибки.

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

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <City>Bengaluru</City>
       <Name>Apigee</Name>
       <Pincode>560016</Pincode>
    

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

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

    Переданная в API полезная нагрузка XML недопустима, так как в XML нет закрывающего тега для элемента <root>. Вы получите код ошибки:

    steps.xml2json.ExecutionFailed
    

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

Разрешение

Убедитесь, что входные данные, передаваемые в правило XML в JSON через элемент <Source>, действительны и не повреждены.

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

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <City>Bengaluru</City>
   <Name>Apigee</Name>
   <Pincode>560016</Pincode>
</root>

OutputVariableIsNotAvailable

Код ошибки

steps.xml2json.OutputVariableIsNotAvailable

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

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.xml2json.OutputVariableIsNotAvailable"
        }
    }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "XMLToJSON[Convert-XMLToJSON]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.xml2json.OutputVariableIsNotAvailable"
        }
    }
}

Причина

Эта ошибка возникает, если переменная, указанная в элементе <Source> правила XML в JSON, имеет строковый тип, а элемент <OutputVariable> не определен. Элемент <OutputVariable> обязателен, если переменная, определенная в элементе <Source>, имеет тип string.

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

  1. Определите правило XML в JSON, в котором произошла ошибка. Его можно найти в элементе faultstring ответа об ошибке. Например, в следующем фрагменте кода faultstring название правила – Convert-XMLToJSON:

    "faultstring": "XMLToJSON[Convert-XMLToJSON]: Output variable is not available."
    
  2. В правиле "Не удалось преобразовать XML в JSON" проверьте, не отсутствует ли <OutputVariable>.

    Ниже приведен пример правила XML для JSON, в котором отсутствует элемент <OutputVariable>.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
        <DisplayName>Convert-XMLToJSON</DisplayName>
        <Properties/>
        <Format>google</Format>
        <Source>TrackingNumber</Source>
    </XMLToJSON>
    
    
  3. Определите тип переменной, указанной в элементе <Source>:

    1. Найдите в пакете прокси API код, в котором впервые была определена переменная.
    2. Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
      1. Проверьте значение атрибута type (если он есть).
      2. Если атрибут type отсутствует, переменная считается строкой.
    3. Если тип переменной – string, то именно это и является причиной ошибки. Информацию о распространенных переменных и их типах можно найти в справочнике по переменным.

    Например, посмотрите на переменную TrackingNumber в приведенном выше правиле преобразования XML в JSON. Это строка. Теперь рассмотрим правило "Назначить сообщение", которое используется для присвоения значения переменной TrackingNumber, как показано ниже:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
        <DisplayName>Assign_TrackingNumber</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>TrackingNumber</Name>
            <Value><![CDATA[<Code>560075393539898</Code>]]></Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Обратите внимание, что тип переменной, заданный с помощью <AssignVariable>, – строка. Таким образом, переменная TrackingNumber имеет строковый тип.

    Напомним, что переменная TrackingNumber используется в элементе <Source> правила XML в JSON:

    <Source>TrackingNumber</Source>
    

    Поскольку TrackingNumber имеет строковый тип, а <OutputVariable> отсутствует в правилах, вы получите код ошибки:

    steps.xml2json.OutputVariableIsNotAvailable
    

Разрешение

Если переменная, указанная в элементе <Source> правила XMLToJSON, имеет тип string, элемент <OutputVariable> является обязательным.

Чтобы исправить правило XML в JSON, о котором говорилось выше, добавьте элемент <OutputVariable>, как показано ниже.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XMLToJSON async="false" continueOnError="false" enabled="true" name="Convert-XMLToJSON">
    <DisplayName>Convert-XMLToJSON</DisplayName>
    <Properties/>
    <Format>google</Format>
    <OutputVariable>response</OutputVariable>
    <Source>TrackingNumber</Source>
</XMLToJSON>

InCompatibleTypes

Код ошибки

steps.xml2json.InCompatibleTypes

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

{
    "fault": {
        "faultstring": "XMLToJSON[policy_name]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.xml2json.InCompatibleTypes"
        }
    }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "XMLToJSON[XMLToJSON_CheckType]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.xml2json.InCompatibleTypes"
        }
    }
}

Причина

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

The valid types are message and string.

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

  1. Определите правило XML в JSON, в котором произошла ошибка. Его можно найти в элементе faultstring ответа об ошибке. Например, в следующем фрагменте кода faultstring название правила – XMLToJSON_CheckType:

    "faultstring": "XMLToJSON[XMLToJSON_CheckType]: String can not be assigned to message type."
    
  2. В примечании к правилу "Не удалось преобразовать XML в JSON" запишите значения, указанные в <OutputVariable>.

    Ниже приведен пример правила XMLToJSON, в котором отсутствует элемент <OutputVariable>.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
        <DisplayName>XMLToJSON_CheckType</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>request</OutputVariable>
        <Source>TrackingNumber</Source>
    </XMLToJSON>
    
  3. Определите тип переменной, указанной в элементах <Source> и <OutputVariable>:

    1. Найдите код в пакете прокси API, где впервые были определены эти переменные.
    2. Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
      1. Проверьте значение атрибута type (если он есть).
      2. Если атрибут type отсутствует, переменная считается строкой.
    3. Если тип переменной, указанной в <Source>, – string, а тип <OutputVariable> – message или наоборот, это и является причиной ошибки. Информацию о распространенных переменных и их типах можно найти в справочнике по переменным.

    Например, рассмотрим правило Assign Message, которое используется для присвоения значения переменной TrackingNumber, как показано ниже:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
        <DisplayName>Assign_TrackingNumber</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>TrackingNumber</Name>
            <Value><![CDATA[<Code>560075393539898</Code>]]></Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    Обратите внимание, что тип переменной, заданный с помощью <AssignVariable>, – строка. Таким образом, переменная TrackingNumber имеет строковый тип.

    Напомним, что переменная TrackingNumber используется в элементе <Source> правила XMLToJSON:

    <Source>TrackingNumber</Source>
    

    Напомним, что переменная request используется в элементе <OutputVariable> правила "XML в JSON":

    <OutputVariable>request</OutputVariable>
    

    Поскольку TrackingNumber имеет тип string, а переменная response – тип message, эти типы несовместимы, поэтому вы получаете код ошибки:

    steps.xml2json.InCompatibleTypes
    

    Эта ошибка также может возникнуть, если переменная в элементе <Source> имеет тип message, а переменная в элементе <OutputVariable> – строковый тип.

Разрешение

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

Чтобы исправить описанное выше правило XML To JSON, можно объявить ещё одну переменную TrackingNumber_output типа string, используя правило Assign Message, и использовать эту переменную в элементе <OutputVariable> правила XML To JSON.

Измененные правила назначения сообщений:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_TrackingNumber">
    <DisplayName>Assign_TrackingNumber</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name>TrackingNumber</Name>
        <Value><![CDATA[<Code>560098</Code>]]></Value>
        <Ref/>
    </AssignVariable>
    <AssignVariable>
        <Name>TrackingNumber_output</Name>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

Измененные правила XMLToJSON:

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
      <DisplayName>XMLToJSON_CheckType</DisplayName>
      <Properties/>
      <Format>google</Format>
      <OutputVariable>TrackingNumber_output</OutputVariable>
      <Source>TrackingNumber</Source>
  </XMLToJSON>

InvalidSourceType

Код ошибки

steps.xml2json.InvalidSourceType

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

{
    "fault": {
        "faultstring": "XMLToJSON[class invalid_class]: Invalid source type class invalid_class. Valid source types are [message, string].",
        "detail": {
            "errorcode": "steps.xml2json.InvalidSourceType"
        }
    }
}

Пример сообщения об ошибке

{
    "fault": {
        "faultstring": "XMLToJSON[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string].",
        "detail": {
            "errorcode": "steps.xml2json.InvalidSourceType"
        }
    }
}

Причина

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

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

  1. Определите недопустимый тип источника, используемый в правиле XML в JSON. Эту информацию можно найти в сообщении об ошибке. Например, в приведенной ниже ошибке недопустимый тип – integer.

    "faultstring": "XMLToJSON[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string]."
    
  2. Проверьте все правила XML в JSON в определенном прокси-сервере API, где произошел сбой. В примечании к правилу "XML в JSON" найдите название переменной, указанное в <Source>.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <XMLToJSON async="false" continueOnError="false" enabled="true" name="XMLToJSON_CheckType">
        <DisplayName>XMLToJSON_CheckType</DisplayName>
        <Properties/>
        <Format>google</Format>
        <OutputVariable>response</OutputVariable>
        <Source>BookCode</Source>
    </XMLToJSON>
    
  3. Определите тип переменной, указанной в элементе <Source>:

    1. Найдите код в пакете прокси API, где эта переменная была определена впервые.
    2. Определив, в каких правилах переменная задается и заполняется первой, определите ее тип, выполнив следующие действия:
      1. Проверьте значение атрибута type (если он есть).
      2. Если атрибут type отсутствует, переменная считается строкой.
    3. Если тип переменной, указанной в <Source>, не является ни message, ни string, то это и есть причина ошибки. Информацию о распространенных переменных и их типах можно найти в справочнике по переменным.

    Например, рассмотрим правило ExtractVariables, которое используется для извлечения значения из полезной нагрузки XML и присваивает значение переменной BookCode типа integer, как показано ниже:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables async="false" continueOnError="false" enabled="true" name="Extract_BookCode">
        <DisplayName>Extract_BookCode</DisplayName>
        <Properties/>
        <Source>request</Source>
        <XMLPayload stopPayloadProcessing="false">
            <Variable name="BookCode" type="integer">
                <XPath>/root/BookCode</XPath>
            </Variable>
        </XMLPayload>
    </ExtractVariables>
    

    Напомним, что переменная BookCode используется в элементе <Source> правила XML в JSON:

    <Source>BookCode</Source>
    

    Поскольку тип этой переменной – Integer, который не является допустимым типом <Source>, прокси API завершается с ошибкой:

    steps.xml2json.InvalidSourceType
    

Разрешение

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

Чтобы избежать описанной выше ошибки при использовании правила XML To JSON, можно использовать переменную request типа message или любую другую строку, которая является допустимой полезной нагрузкой XML.