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

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

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

Код ошибки

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 to JSON, недействительны или имеют неверный формат.

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

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

Например, если элемент <Source> в политике XML to 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> установлен для запроса:

    <?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> установлено значение ответа, но внутренний сервер передает пустые полезные данные.

Разрешение

Убедитесь, что входные данные, передаваемые в политику 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 To 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> установлено значение ответа, но полезные данные ответа 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>

ВыходнаяVariableIsNotAvailable

Код ошибки

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

    <OutputVariable>request</OutputVariable>
    

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

    steps.xml2json.InCompatibleTypes
    

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

Разрешение

Убедитесь, что тип переменной, определенной в элементе <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>

Инвалидсаурцетип

Код ошибки

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 To 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 To JSON:

    <Source>BookCode</Source>
    

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

    steps.xml2json.InvalidSourceType
    

Разрешение

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

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