عیب یابی خطای زمان اجرا خط مشی JSON به XML

شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید .
اطلاعات

منبع در دسترس نیست

کد خطا

steps.json2xml.SourceUnavailable

متن پاسخ خطا

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

خطای مثال

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

علت

این خطا زمانی رخ می‌دهد که متغیر message مشخص شده در عنصر <Source> از سیاست JSON to XML یکی از موارد زیر باشد:

  • خارج از محدوده (در جریان خاصی که سیاست در آن اجرا می‌شود، در دسترس نیست) یا
  • قابل حل نیست (تعریف نشده است)

برای مثال، این خطا زمانی رخ می‌دهد که قرار باشد سیاست تبدیل JSON به XML در جریان درخواست اجرا شود، اما عنصر <Source> روی متغیر response تنظیم شده باشد، که در جریان درخواست وجود ندارد.

تشخیص

  1. سیاست تبدیل JSON به XML که خطا در آن رخ داده و نام متغیری که در دسترس نیست را مشخص کنید. می‌توانید هر دوی این موارد را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام سیاست Convert-JSONToXML و متغیر response است:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Source response is not available"
    
  2. در سیاست ناموفق تبدیل JSON به XML در فایل XML، بررسی کنید که نام متغیر تنظیم شده در عنصر <Source> با نام متغیر شناسایی شده در رشته خطا (مرحله 1 در بالا) مطابقت داشته باشد. برای مثال، سیاست JSON به XML زیر متغیری به نام response در عنصر <Source> مشخص می‌کند که با آنچه در faultstring است مطابقت دارد:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
        <DisplayName>Convert-JSONToXML</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <OutputVariable>request</OutputVariable>
        <Source>response</Source>
    </JSONToXML>
    
  3. تعیین می‌کند که آیا متغیر استفاده شده در عنصر <Source> در جریانی که سیاست تبدیل JSON به XML در آن اجرا می‌شود، تعریف شده و در دسترس است یا خیر.

  4. اگر متغیر یکی از موارد زیر باشد:

    • خارج از محدوده (در جریان خاصی که سیاست در آن اجرا می‌شود، در دسترس نیست) یا
    • قابل حل نیست (تعریف نشده است)

    پس علت خطا همین است.

    به عنوان مثال، فرض کنید قرار است سیاست تبدیل JSON به XML که در بالا نشان داده شده است، در جریان درخواست اجرا شود. به یاد بیاورید که متغیر response در عنصر <Source> از سیاست JSON به XML استفاده می‌شود. متغیر پاسخ فقط در جریان پاسخ در دسترس است.

    از آنجا که متغیر response در جریان درخواست وجود ندارد، کد خطا را دریافت می‌کنید:

    steps.json2xml.SourceUnavailable
    

وضوح تصویر

مطمئن شوید که متغیر تنظیم‌شده در عنصر <Source> از سیاست ناموفق تبدیل JSON به XML، تعریف شده و در جریان اجرای سیاست وجود دارد.

برای اصلاح مثال مربوط به سیاست تبدیل JSON به XML که در بالا نشان داده شده است، می‌توانید عنصر <Source> را طوری تغییر دهید که از متغیر request استفاده کند، زیرا در جریان درخواست وجود دارد:

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
      <DisplayName>Convert-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>request</OutputVariable>
      <Source>request</Source>
  </JSONToXML>

اجرا ناموفق بود

کد خطا

steps.json2xml.ExecutionFailed

متن پاسخ خطا

{
   "fault": {
        "faultstring": "JSONToXML[policy_name]: Execution failed due to reason: Expecting { or [ at line 1",
        "detail": {
            "errorcode": "steps.json2xml.ExecutionFailed"
        }
    }
}

علل احتمالی

علل احتمالی این خطا عبارتند از:

علت توضیحات
ورودی ناقص مقدار داده ورودی (JSON) خالی است.
ورودی نامعتبر یا ناقص ورودی (JSON) ارسال شده به خط‌مشی JSON to XML نامعتبر یا ناقص است.

علت: فقدان بار ورودی

در سیاست تبدیل JSON به XML اگر محتوای (payload) متغیر مشخص شده در عنصر <Source> خالی باشد، این خطا رخ می‌دهد.

برای مثال، اگر عنصر <Source> در سیاست JSON to XML به عنوان یک متغیر request یا response تنظیم شده باشد و قرار باشد حاوی یک payload از نوع JSON باشند، اما اگر payload خالی باشد، خطا رخ می‌دهد.

تشخیص

  1. سیاست تبدیل JSON به XML را که خطا در آن رخ داده است، شناسایی کنید. می‌توانید این اطلاعات را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام سیاست Convert-JSONToXML است:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. عنصر <Source> را در سیاست ناموفق JSON to XML در فایل XML بررسی کنید و متغیر مشخص شده را تعیین کنید. برای مثال، سیاست JSON to XML زیر عنصر <Source> را روی request تنظیم کرده است:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
    <DisplayName>Convert-JSONToXML</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>request</OutputVariable>
    <Source>request</Source>
    </JSONToXML>
    
  3. بررسی کنید که آیا متغیر مشخص شده برای عنصر <Source> در سیاست خالی است یا خیر. اگر خالی باشد، دلیل خطا همین است.

    در مثال مربوط به سیاست تبدیل JSON به XML که در بالا نشان داده شده است، بار داده درخواست (یعنی بدنه درخواست) که توسط کلاینت ارسال شده است، خالی است.

    برای مثال:

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

    از آنجا که محتوای پاسخ JSON خالی است، کد خطا را دریافت می‌کنید:

    steps.json2xml.ExecutionFailed
    

    این خطا همچنین می‌تواند در صورتی رخ دهد که عنصر <Source> روی response تنظیم شده باشد، اما یک payload خالی توسط سرور backend ارسال شود.

وضوح تصویر

مطمئن شوید که ورودی ارسالی به سیاست JSON to XML در عنصر <Source> ، دارای بار داده JSON معتبر و غیر خالی باشد.

برای رفع مشکل مربوط به نمونه‌ی خط‌مشی تبدیل JSON به XML، یک payload معتبر JSON ارسال کنید. برای مثال:

  1. فایلی با نام city.json با محتوای زیر ایجاد کنید:

    {
      "Name":"Apigee",
      "City":"Bengaluru",
      "Pincode":"560016"
    }
    
  2. فراخوانی API را با استفاده از دستور cURL به صورت زیر انجام دهید:

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

علت: ورودی نامعتبر یا ناقص

اگر سیاست تبدیل JSON به XML ورودی نامعتبر یا ناقص را تجزیه کند، این خطا را دریافت خواهید کرد.

برای مثال، اگر JSON نامعتبر زیر به عنوان ورودی به سیاست JSON to XML ارائه شود،

[
    "args": ["name" : "Google" ]
]

شما خطا را دریافت خواهید کرد:

"faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"

تشخیص

  1. سیاست تبدیل JSON به XML را که خطا در آن رخ داده است، شناسایی کنید. می‌توانید این اطلاعات را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام سیاست Convert-JSONToXML است:

    "faultstring": "JSONToXML[Convert-JSONToXML]: Execution failed due to reason: Expecting { or [ at line 1"
    
  2. عنصر <Source> مشخص شده در سیاست ناموفق JSON to XML در XML را بررسی کنید. برای مثال، سیاست JSON to XML زیر دارای عنصر <Source> است که روی متغیر request تنظیم شده است:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="Convert-JSONToXML">
      <DisplayName>Convert-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>request</OutputVariable>
      <Source>request</Source>
    </JSONToXML>
    
  3. اگر ورودی مشخص شده در عنصر <Source> یک JSON payload معتبر باشد، اعتبارسنجی کنید. اگر ورودی نامعتبر یا ناقص باشد، دلیل خطا همین است.

    فرض کنید JSON نامعتبر زیر به پالیسی ارسال شده است.

    [
        "args": ["name" : "Google" ]
    ]
    

    در اینجا نمونه فراخوانی API را مشاهده می‌کنید که نحوه ارسال درخواست را نشان می‌دهد:

    curl -v "http://<org>-<env>.apigee.net/v1/testjsontoxml" -H "Content-Type:
    application/json" -X POST -d '[ "args" : ["name" : "Google" ]]'
    

    بار داده JSON ارسال شده در درخواست نامعتبر است زیرا شیء JSON با براکت‌های مربعی ([]) شروع و پایان می‌یابد. به همین دلیل، کد خطا را دریافت می‌کنید:

    steps.json2xml.ExecutionFailed

    این خطا همچنین می‌تواند در صورتی رخ دهد که عنصر <Source> روی response تنظیم شده باشد اما payload پاسخ JSON نامعتبر یا ناقص باشد.

وضوح تصویر

مطمئن شوید که ورودی ارسالی به JSON در XML policy در عنصر <Source> معتبر بوده و ناقص نباشد.

برای رفع مشکل مربوط به نمونه خط‌مشی تبدیل JSON به XML که در بالا مورد بحث قرار گرفت، یک درخواست معتبر JSON به صورت زیر ارسال کنید:

{
  "args"  : {

        "name"  :  "Google"
   }
}

متغیر خروجی در دسترس نیست

کد خطا

steps.json2xml.OutputVariableIsNotAvailable

متن پاسخ خطا

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

خطای مثال

{
    "fault": {
        "faultstring": "JSONToXML[Check-JSONToXML]: Output variable is not available.",
        "detail": {
            "errorcode": "steps.json2xml.OutputVariableIsNotAvailable"
        }
    }
}

علت

این خطا زمانی رخ می‌دهد که متغیر مشخص شده در عنصر <Source> از JSON to XML Policy از نوع رشته باشد و عنصر <OutputVariable> تعریف نشده باشد. عنصر <OutputVariable> زمانی اجباری است که متغیر تعریف شده در عنصر <Source> از نوع رشته باشد.

تشخیص

  1. خط‌مشی JSON to XML که خطا در آن رخ داده است را شناسایی کنید. می‌توانید این را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام خط‌مشی Check-JSONToXML است:

    "faultstring": "JSONToXML[Check-JSONToXML]: Output variable is not available."
    
  2. در خط‌مشی JSON به XML ناموفق، اگر <OutputVariable> وجود ندارد، اعتبارسنجی کنید.

    نمونه‌ی سیاست JSONToXML زیر فاقد عنصر <OutputVariable> است:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
        <DisplayName>Check-JSONToXML</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
            <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <Source>PostalCode</Source>
    </JSONToXML>
    
  3. نوع متغیر مشخص شده در عنصر <Source> را تعیین می‌کند:

    1. کدی را در API Proxy که متغیر ابتدا در آن تعریف شده است، پیدا کنید.
    2. پس از اینکه سیاستی را که متغیر در آن تعریف و پر می‌شود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
      1. مقدار ویژگی نوع (type) را (در صورت وجود) بررسی کنید.
      2. اگر ویژگی نوع وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    3. اگر نوع متغیر رشته باشد، علت خطا همین است. می‌توانید در مرجع متغیرها (Variables) درباره متغیرهای رایج و انواع آنها اطلاعات کسب کنید.

    برای مثال، به متغیر PostalCode در سیاست تبدیل JSON به XML بالا نگاه کنید.

    به عنوان مثال، در نظر بگیرید که از یک سیاست Assign Message برای اختصاص یک مقدار به متغیری به نام PostalCode استفاده می‌شود، همانطور که در زیر نشان داده شده است:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
        <DisplayName>Assign_PostalCode</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>PostalCode</Name>
            <Value>{"value":"56008"}</Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    توجه داشته باشید که نوع متغیر تنظیم شده در <AssignVariable> رشته است. بنابراین متغیر PostalCode از نوع رشته است.

    حال، به یاد بیاورید که متغیر PostalCode در عنصر <Source> از سیاست JSONToXML استفاده می‌شود:

    <Source>PostalCode</Source>
    

    از آنجا که PostalCode از نوع رشته است و عنصر <OutputVariable> وجود ندارد، کد خطا را دریافت می‌کنید:

    steps.json2xml.OutputVariableIsNotAvailable
    

وضوح تصویر

مطمئن شوید که اگر متغیر مشخص شده در عنصر <Source> از JSONToXML Policy از نوع رشته است، عنصر <OutputVariable> درون آن Policy تعریف شده باشد.

برای اصلاح سیاست JSONToXML که در بالا مورد بحث قرار گرفت، یک عنصر <OutputVariable> مانند شکل زیر اضافه کنید.

  <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
      <DisplayName>Check-JSONToXML</DisplayName>
      <Properties/>
      <Options>
          <NullValue>NULL</NullValue>
          <NamespaceBlockName>#namespaces</NamespaceBlockName>
          <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
          <NamespaceSeparator>:</NamespaceSeparator>
          <TextNodeName>#text</TextNodeName>
          <AttributeBlockName>#attrs</AttributeBlockName>
          <AttributePrefix>@</AttributePrefix>
          <InvalidCharsReplacement>_</InvalidCharsReplacement>
          <ObjectRootElementName>Root</ObjectRootElementName>
          <ArrayRootElementName>Array</ArrayRootElementName>
          <ArrayItemElementName>Item</ArrayItemElementName>
      </Options>
      <OutputVariable>response</OutputVariable>
      <Source>PostalCode</Source>
  </JSONToXML>

انواع ناسازگار

کد خطا

steps.json2xml.InCompatibleTypes

متن پاسخ خطا

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

خطای مثال

{
    "fault": {
        "faultstring": "JSONToXML[JSONToXML_checktype]: String can not be assigned to message type.",
        "detail": {
            "errorcode": "steps.json2xml.InCompatibleTypes"
        }
    }
}

علت

این خطا زمانی رخ می‌دهد که نوع متغیر تعریف‌شده در عنصر <Source> و عنصر <OutputVariable> یکسان نباشند. الزامی است که نوع متغیرهای موجود در عنصر <Source> و عنصر <OutputVariable> با هم مطابقت داشته باشند.

انواع معتبر عبارتند از message و string .

تشخیص

  1. خط‌مشی JSON to XML که خطا در آن رخ داده است را شناسایی کنید. می‌توانید این را در عنصر faultstring پاسخ خطا پیدا کنید. برای مثال، در faultstring زیر، نام خط‌مشی JSONToXML_checktype است:

    "faultstring": "JSONToXML[JSONToXML_checktype]: String can not be assigned to message type."
    
  2. در خطای JSON to XML Policy که با شکست مواجه شد، به مقادیر مشخص شده در <OutputVariable> و <Source> توجه کنید.

    به مثال زیر از سیاست‌ها توجه کنید:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML_checktype">
        <DisplayName>JSONToXML_checktype</DisplayName>
        <Properties/>
        <Options>
            <NullValue>NULL</NullValue>
            <NamespaceBlockName>#namespaces</NamespaceBlockName>
            <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
            <NamespaceSeparator>:</NamespaceSeparator>
            <TextNodeName>#text</TextNodeName>
            <AttributeBlockName>#attrs</AttributeBlockName>
            <AttributePrefix>@</AttributePrefix>
            <InvalidCharsReplacement>_</InvalidCharsReplacement>
            <ObjectRootElementName>Root</ObjectRootElementName>
            <ArrayRootElementName>Array</ArrayRootElementName>
            <ArrayItemElementName>Item</ArrayItemElementName>
        </Options>
        <OutputVariable>response</OutputVariable>
        <Source>PostalCode</Source>
    </JSONToXML>
    
    
  3. نوع متغیر مشخص شده در عناصر <Source> و <OutputVariable> را تعیین می‌کند:

    1. کدی را در API Proxy پیدا کنید که هر یک از این متغیرها ابتدا در آن تعریف شده‌اند.
    2. پس از اینکه سیاستی را که متغیر در آن تعریف و پر می‌شود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
      1. مقدار ویژگی نوع (type) را (در صورت وجود) بررسی کنید.
      2. اگر ویژگی نوع وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    3. اگر نوع متغیر مشخص شده در <Source> رشته باشد در حالی که نوع <OutputVariable> پیام باشد یا برعکس، علت خطا همین است. می‌توانید در مرجع متغیرها درباره متغیرهای رایج و انواع آنها اطلاعات کسب کنید.

    به عنوان مثال، یک سیاست Assign Message را در نظر بگیرید که برای اختصاص یک مقدار به متغیری به نام PostalCode استفاده می‌شود، همانطور که در زیر نشان داده شده است:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
        <DisplayName>Assign_PostalCode</DisplayName>
        <Properties/>
        <AssignVariable>
            <Name>PostalCode</Name>
            <Value>{"value":"56008"}</Value>
            <Ref/>
        </AssignVariable>
        <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
        <AssignTo createNew="false" transport="http" type="request"/>
    </AssignMessage>
    

    توجه داشته باشید که نوع متغیر تنظیم شده در <AssignVariable> رشته است؛ بنابراین، متغیر PostalCode از نوع رشته است.

    حال، به یاد بیاورید که متغیر PostalCode در عنصر <Source> از سیاست JSONToXML استفاده می‌شود:

    <Source>PostalCode</Source>
    

    به طور مشابه، به یاد داشته باشید که متغیر response در عنصر <OutputVariable> از سیاست JSONToXML استفاده می‌شود:

    <OutputVariable>response</OutputVariable>
    

    از آنجا که PostalCode از نوع رشته‌ای است در حالی که متغیر response از نوع پیام است، آنها انواع ناسازگاری هستند، بنابراین کد خطا دریافت می‌کنید:

    steps.json2xml.InCompatibleTypes
    

    خطای فوق همچنین می‌تواند در صورتی رخ دهد که متغیر موجود در عنصر <Source> از نوع message باشد اما متغیر موجود در عنصر <OutputVariable> از نوع رشته باشد.

وضوح تصویر

مطمئن شوید که نوع متغیر تعریف شده در عنصر <Source> و عنصر <OutputVariable> همیشه یکسان باشند. الزامی است که نوع متغیرهای موجود در عنصر <Source> و عنصر <OutputVariable> با هم مطابقت داشته باشند. یعنی، مطمئن شوید که نوع عناصر <Source> و <OutputVariable> هر دو از نوع رشته یا پیام باشند.

برای اصلاح سیاست تبدیل JSON به XML که در بالا مورد بحث قرار گرفت، می‌توانید متغیر دیگری PostalCode_output از نوع رشته را با استفاده از Assign Message Policy تعریف کنید و از این متغیر در عنصر <OutputVariable> از سیاست تبدیل JSON به XML استفاده کنید.

سیاست تغییر یافته‌ی اختصاص پیام:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign_PostalCode">
    <DisplayName>Assign_PostalCode</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Value>{"value":"56008"}</Value>
        <Ref/>
    </AssignVariable>
    <AssignVariable>
        <Name>PostalCode_output</Name>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

سیاست اصلاح‌شده‌ی JSONToXML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
    <DisplayName>JSONToXML_checktype</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>PostalCode_output</OutputVariable>
    <Source>PostalCode</Source>
</JSONToXML>

نوع منبع نامعتبر

کد خطا

steps.json2xml.InvalidSourceType

متن پاسخ خطا

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

خطای مثال

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

علت

این خطا زمانی رخ می‌دهد که نوع متغیری که برای تعریف عنصر <Source> استفاده می‌شود، نامعتبر باشد. انواع معتبر متغیر message و string هستند.

تشخیص

  1. نوع منبع نامعتبر مورد استفاده در سیاست JSON to XML را شناسایی کنید. می‌توانید این اطلاعات را در پیام خطا پیدا کنید. برای مثال، در خطای زیر، نوع نامعتبر Integer است.

    "faultstring": "JSONToXML[class java.lang.Integer]: Invalid source type class java.lang.Integer. Valid source types are [message, string]."
    
  2. تمام سیاست‌های JSON به XML را در API Proxy خاصی که در آن خرابی رخ داده است، بررسی کنید. در سیاست JSON به XML خراب، نام متغیر مشخص شده در <Source> را یادداشت کنید.

    در اینجا یک نمونه سیاست وجود دارد که متغیری به نام EmployeeID در عنصر <Source> مشخص شده است:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSONToXML">
    <DisplayName>Check_SourceType</DisplayName>
    <Properties/>
    <Options>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName>
        <NamespaceSeparator>:</NamespaceSeparator>
        <TextNodeName>#text</TextNodeName>
        <AttributeBlockName>#attrs</AttributeBlockName>
        <AttributePrefix>@</AttributePrefix>
        <InvalidCharsReplacement>_</InvalidCharsReplacement>
        <ObjectRootElementName>Root</ObjectRootElementName>
        <ArrayRootElementName>Array</ArrayRootElementName>
        <ArrayItemElementName>Item</ArrayItemElementName>
    </Options>
    <OutputVariable>request</OutputVariable>
    <Source>EmployeeID</Source>
</JSONToXML>
  1. نوع متغیر مشخص شده در عنصر <Source> را تعیین می‌کند:

    1. کدی را در API Proxy که این متغیر ابتدا در آن تعریف شده است، پیدا کنید.
    2. پس از اینکه سیاستی را که متغیر در آن تعریف و پر می‌شود، مشخص کردید، باید نوع آن متغیر را به شرح زیر تعیین کنید:
      1. مقدار ویژگی نوع (type) را (در صورت وجود) بررسی کنید.
      2. اگر ویژگی نوع وجود نداشته باشد، متغیر به عنوان یک رشته در نظر گرفته می‌شود.
    3. اگر نوع متغیر مشخص شده در <Source> نه از نوع پیام باشد و نه از نوع رشته، علت خطا همین است. می‌توانید در مرجع متغیرها (Variables) درباره متغیرهای رایج و انواع آنها اطلاعات کسب کنید.

    به عنوان مثال، در نظر بگیرید که از سیاست ExtractVariables برای استخراج مقدار از یک JSON payload استفاده می‌شود و مقدار را مطابق شکل زیر روی متغیر EmployeeID از نوع عدد صحیح تنظیم می‌کند:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ExtractVariables name="ExtractJSONVariables">
        <Source>request</Source>
        <JSONPayload>
            <Variable name="EmployeeID" type="integer">
                <JSONPath>$.ID</JSONPath>
            </Variable>
        </JSONPayload>
    </ExtractVariables>
    

    حال، به یاد بیاورید که متغیر EmployeeID در عنصر <Source> از سیاست JSONToXML استفاده می‌شود:

    <Source>EmployeeID</Source>
    

    از آنجا که نوع این متغیر Integer است که یک نوع معتبر <Source> نیست، API Proxy با خطای زیر مواجه می‌شود:

    steps.json2xml.InvalidSourceType
    

وضوح تصویر

مطمئن شوید که نوع متغیری که برای مشخص کردن عنصر <Source> استفاده می‌شود، معتبر است. انواع معتبر <Source> عبارتند از message و string .

برای جلوگیری از خطای فوق با سیاست JSONToXML، می‌توانید از متغیر درخواستی که از نوع پیام است یا هر رشته دیگری که یک بار داده معتبر JSON است، استفاده کنید.