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

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

Источник недоступен

Код ошибки

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"
        }
    }
}

Причина

Эта ошибка возникает, если переменная сообщения или строка, указанная в элементе <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 указывает переменную с именем response в элементе <Source> , которая совпадает с именем в 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. Переменная ответа доступна только в потоке ответа.

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

    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>

Выполнение завершилось с ошибкой.

Код ошибки

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"
        }
    }
}

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

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

Причина Описание
Отсутствует входная полезная нагрузка Входные данные (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-файле политики преобразования 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-файле политики преобразования 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 в политику извлечения переменных был передан следующий недопустимый XML-код через файл city.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
    

    XML-данные, переданные в API, недействительны, поскольку в 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, имеет тип string, а элемент <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 Proxy, где эта переменная была определена впервые.
    2. После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
      1. Проверьте значение атрибута типа (если он присутствует).
      2. Если атрибут типа отсутствует, то переменная считается строкой.
    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, имеет строковый тип, то элемент <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>

Несовместимые Типы

Код ошибки

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 Policy обратите внимание на значения, указанные в <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 Proxy код, где каждая из этих переменных была определена впервые.
    2. После того, как вы определите политику, в соответствии с которой переменная определяется и заполняется в первую очередь, вам необходимо определить тип этой переменной следующим образом:
      1. Проверьте значение атрибута типа (если он присутствует).
      2. Если атрибут типа отсутствует, то переменная считается строкой.
    3. Если тип переменной, указанной в <Source>string , а тип <OutputVariable> — сообщение, или наоборот, то это и является причиной ошибки. Подробнее о распространенных переменных и их типах можно узнать в справочнике по переменным .

    В качестве примера рассмотрим политику назначения сообщений, которая используется для присвоения значения переменной с именем 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> имеет тип string.

Разрешение

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

Для исправления описанной выше политики преобразования XML в JSON можно объявить еще одну переменную TrackingNumber_output типа string используя политику назначения сообщений, и использовать эту переменную в элементе <OutputVariable> политики преобразования XML в 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. Эту информацию можно найти в сообщении об ошибке. Например, в следующем сообщении об ошибке недопустимый тип — целое число.

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

    steps.xml2json.InvalidSourceType
    

Разрешение

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

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