การแก้ปัญหาข้อผิดพลาดรันไทม์ของคำขอราคาเสนอบริการ

คุณกําลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
info

RequestVariableNotMessageType

รหัสข้อผิดพลาด

steps.servicecallout.RequestVariableNotMessageType

เนื้อหาการตอบกลับข้อผิดพลาด

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotMessageType"
        }
    }
}

สาเหตุ

ข้อผิดพลาดนี้เกิดขึ้นหากตัวแปรที่ระบุไว้ในองค์ประกอบ <Request> ของนโยบายข้อความไฮไลต์บริการไม่ใช่ประเภท message คุณจะเห็นข้อผิดพลาดนี้หากตัวแปรเป็นสตริงหรือประเภทอื่นๆ ที่ไม่ใช่ข้อความ

ตัวแปรประเภทข้อความแสดงคําขอและคําตอบ HTTP ทั้งหมด ตัวแปรโฟลว์ Edge ในตัว request, response และ message เป็นประเภทข้อความ ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรข้อความได้ที่ข้อมูลอ้างอิงเกี่ยวกับตัวแปร

การวินิจฉัย

  1. ระบุนโยบายคำขอราคาเสนอบริการที่เกิดข้อผิดพลาดขึ้นและชื่อของตัวแปรที่มีประเภทไม่ถูกต้อง คุณดูรายการทั้ง 2 รายการนี้ได้ในองค์ประกอบ faultstring ของการตอบกลับข้อผิดพลาด ตัวอย่างเช่น ใน faultstring ต่อไปนี้ ชื่อนโยบายคือ ExecuteGeocodingRequest และตัวแปรคือ PostalCode

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable PostalCode value is not of type Message"

  2. ใน XML นโยบายข้อความไฮไลต์บริการที่ไม่ผ่าน ให้ตรวจสอบว่าชื่อตัวแปรที่ตั้งค่าไว้ในองค์ประกอบ <Request> ตรงกับชื่อตัวแปรที่ระบุไว้ในสตริงข้อบกพร่อง (ขั้นตอนที่ 1 ด้านบน) ตัวอย่างเช่น นโยบายต่อไปนี้ระบุตัวแปรคำขอชื่อ PostalCode ซึ่งตรงกับสิ่งที่อยู่ใน faultstring

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="PostalCode"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. ตรวจสอบว่าตัวแปรนี้เป็นประเภทข้อความหรือไม่

    1. ค้นหาโค้ดภายในแพ็กเกจพร็อกซี API ที่กำหนดตัวแปรก่อน
    2. ในกรณีส่วนใหญ่ คุณจะเห็นว่ามีการสร้างและป้อนข้อมูลตัวแปรปัญหาในนโยบายอื่นที่ทำงานก่อนนโยบายข้อความไฮไลต์ของบริการ ตัวอย่างเช่น นโยบายกำหนดข้อความมักใช้ในการสร้างและป้อนข้อมูลตัวแปรในโฟลว์พร็อกซี API
    3. เมื่อทราบนโยบายที่กําหนดตัวแปรและป้อนข้อมูลไว้แล้ว คุณจะต้องระบุประเภทของตัวแปรนั้น ดังนี้
      • ตรวจสอบค่าของแอตทริบิวต์ type (หากมี)
      • หากไม่มีแอตทริบิวต์ type ระบบจะถือว่าตัวแปรเป็นสตริง
    4. หากประเภทของตัวแปรไม่ใช่ข้อความ (เช่น สตริง) แสดงว่านี่คือสาเหตุของข้อผิดพลาด ดูข้อมูลเกี่ยวกับตัวแปรทั่วไปและประเภทของตัวแปรได้ในข้อมูลอ้างอิงเกี่ยวกับตัวแปร

ตัวอย่างเช่น สมมติว่าตัวแปร PostalCode ที่อ้างอิงในนโยบายข้อความไฮไลต์ของบริการสร้างขึ้นในนโยบายการกําหนดข้อความต่อไปนี้ โปรดทราบว่า PostalCode ได้รับค่าของตัวแปรการไหล request.queryparam.postalcode ค่านี้เป็นสตริง เนื่องจากไม่มีแอตทริบิวต์ type ในการกําหนดค่าตัวแปร

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

โปรดทราบว่าตัวแปร PostalCode ใช้อยู่ในองค์ประกอบ <Request> ของนโยบายข้อความไฮไลต์เกี่ยวกับบริการ ดังนี้

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="PostalCode"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

เนื่องจาก PostalCode ไม่ใช่ข้อความ (แต่เป็นสตริงในตัวอย่างนี้) คุณจึงได้รับรหัสข้อผิดพลาด steps.servicecallout.RequestVariableNotMessageType

ความละเอียด

ตรวจสอบว่าตัวแปรที่ตั้งค่าไว้ในองค์ประกอบ <Request> ในนโยบายข้อความไฮไลต์บริการที่ไม่ผ่านการตรวจสอบคือตัวแปรประเภทข้อความที่มีอยู่ หรือคุณจะสร้างตัวแปรประเภทข้อความใหม่ในนโยบายข้อความไฮไลต์บริการโดยตรง (ตามที่อธิบายไว้ในเอกสารประกอบนโยบาย) และใช้ตัวแปรดังกล่าวก็ได้

หากต้องการแก้ไขนโยบาย คุณต้องแก้ไของค์ประกอบ <Request> เพื่อระบุตัวแปรที่มีอยู่หรือตัวแปรใหม่ที่เป็นชนิดข้อความ เช่น ตัวแปร GeocodingRequest ที่ตั้งค่าไว้ในนโยบายกำหนดข้อความเป็นประเภทข้อความ และจะใช้ได้ในนโยบายข้อความไฮไลต์ของบริการ เช่น

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

RequestVariableNotRequestMessageType

รหัสข้อผิดพลาด

steps.servicecallout.RequestVariableNotRequestMessageType

เนื้อหาการตอบกลับข้อผิดพลาด

{
    "fault": {
        "faultstring": "ServiceCallout[policy_name]: request variable [variable_name] value is not of type Request Message",
        "detail": {
            "errorcode": "steps.servicecallout.RequestVariableNotRequestMessageType"
        }
    }
}

สาเหตุ

ข้อผิดพลาดนี้เกิดขึ้นหากตัวแปรที่ระบุในองค์ประกอบ <Request> ของนโยบายข้อความไฮไลต์บริการไม่ใช่ประเภทข้อความคำขอ หากตัวแปรเป็นประเภทข้อความตอบกลับ สตริง หรือประเภทอื่นๆ คุณจะเห็นข้อผิดพลาดนี้

ตัวแปรประเภทข้อความแสดงคำขอ HTTP และการตอบกลับทั้งหมด ตัวแปรโฟลว์ Edge ในตัว request, response และ message เป็นประเภทข้อความ ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวแปรข้อความได้ที่ข้อมูลอ้างอิงตัวแปร

การวินิจฉัย

  1. ระบุนโยบายข้อความไฮไลต์ของบริการที่เกิดข้อผิดพลาดและชื่อตัวแปรที่มีประเภทไม่ถูกต้อง คุณดูรายการทั้ง 2 รายการนี้ได้ในองค์ประกอบ faultstring ของการตอบกลับข้อผิดพลาด ตัวอย่างเช่น ใน faultstring ต่อไปนี้ ชื่อนโยบายคือ ExecuteGeocodingRequest และตัวแปรคือ var_response

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]: request variable var_response value is not of type Message"

  2. ใน XML นโยบายข้อความไฮไลต์บริการที่ไม่ผ่าน ให้ตรวจสอบว่าชื่อตัวแปรที่ตั้งค่าไว้ในองค์ประกอบ <Request> ตรงกับชื่อตัวแปรที่ระบุไว้ในสตริงข้อบกพร่อง (ขั้นตอนที่ 1 ด้านบน) ตัวอย่างเช่น นโยบายต่อไปนี้ระบุตัวแปรคำขอชื่อ var_response ซึ่งตรงกับสิ่งที่อยู่ใน faultstring

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="var_response"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    
  3. ระบุว่าตัวแปรเป็นประเภทของข้อความคำขอหรือไม่ ดังนี้

    1. ค้นหาโค้ดภายในพูล API Proxy ที่กําหนดตัวแปรไว้ก่อน
    2. ในกรณีส่วนใหญ่ คุณจะเห็นว่ามีการสร้างและป้อนข้อมูลตัวแปรปัญหาในนโยบายอื่นที่ทำงานก่อนนโยบายข้อความไฮไลต์ของบริการ ตัวอย่างเช่น นโยบายกำหนดข้อความมักใช้ในการสร้างและป้อนข้อมูลตัวแปรในโฟลว์พร็อกซี API
    3. เมื่อทราบนโยบายที่กําหนดตัวแปรและป้อนข้อมูลไว้แล้ว คุณจะต้องระบุประเภทของตัวแปรนั้น ดังนี้
      • ตรวจสอบค่าของแอตทริบิวต์ type (หากมี)
      • หากไม่มีแอตทริบิวต์ type ระบบจะถือว่าตัวแปรเป็นสตริง
    4. หากประเภทของตัวแปรไม่ใช่ประเภทข้อความคําขอ แสดงว่านี่คือสาเหตุของข้อผิดพลาด ดูข้อมูลเกี่ยวกับตัวแปรทั่วไปและประเภทของตัวแปรได้ในข้อมูลอ้างอิงเกี่ยวกับตัวแปร

ตัวอย่างเช่น สมมติว่าตัวแปร var_response ที่อ้างอิงในนโยบายข้อความไฮไลต์บริการสร้างขึ้นในนโยบาย "มอบหมายข้อความ" ต่อไปนี้ โปรดทราบว่า var_response ได้รับประเภท response ดังนั้น ประเภทของตัวแปร var_response คือข้อความตอบกลับ

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage name="GenerateGeocodingRequest">
        <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo>
    <AssignTo createNew="true" type="response">var_response</AssignTo>
    <Set>
        <QueryParams>
            <QueryParam name="address">{request.queryparam.postalcode}</QueryParam>
            <QueryParam name="region">{request.queryparam.country}</QueryParam>
            <QueryParam name="sensor">false</QueryParam>
        </QueryParams>
        <Verb>GET</Verb>
    </Set>
    <AssignVariable>
        <Name>PostalCode</Name>
        <Ref>request.queryparam.postalcode</Ref>
    </AssignVariable>
    <AssignVariable>
        <Name>Country</Name>
        <Ref>request.queryparam.country</Ref>
    </AssignVariable>
</AssignMessage>

โปรดทราบว่ามีการใช้ตัวแปร var_response ในองค์ประกอบ <Request> ของนโยบายไฮไลต์บริการ

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="var_response"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

เนื่องจาก var_response ไม่ใช่ข้อความประเภทคำขอ (ประเภทคือข้อความตอบกลับ) คุณจึงได้รับรหัสข้อผิดพลาด steps.servicecallout.RequestVariableNotRequestMessageType

ความละเอียด

ตรวจสอบว่าตัวแปรที่ตั้งค่าไว้ในองค์ประกอบ <Request> ในนโยบายข้อความไฮไลต์บริการที่ไม่ผ่านการตรวจสอบคือตัวแปรประเภทข้อความคําขอที่มีอยู่ หรือคุณจะสร้างตัวแปรประเภทข้อความคําขอใหม่ในนโยบายข้อความไฮไลต์บริการโดยตรง (ตามที่อธิบายไว้ในเอกสารประกอบนโยบาย) และใช้ก็ได้

หากต้องการแก้ไขนโยบาย คุณต้องแก้ไของค์ประกอบ <Request> เพื่อระบุตัวแปรที่มีอยู่หรือใหม่ที่เป็นประเภทข้อความคําขอ และตัวแปรดังกล่าวจะทํางานในนโยบายข้อความไฮไลต์ของบริการ เช่น

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

ExecutionFailed

รหัสข้อผิดพลาด

steps.servicecallout.ExecutionFailed

เนื้อหาการตอบกลับข้อผิดพลาด

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: Host not reachable",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

หรือ

{
    "fault": {
        "faultstring": "Execution of ServiceCallout [policy_name] failed. Reason: ResponseCode [http_code] is treated as error",
        "detail": {
            "errorcode": "steps.servicecallout.ExecutionFailed"
        }
    }
}

สาเหตุที่เป็นไปได้

สาเหตุที่เป็นไปได้สำหรับข้อผิดพลาดนี้คือ

สาเหตุ คำอธิบาย
URL ไม่ถูกต้องหรือมีรูปแบบไม่เป็นมาตรฐาน URL เป้าหมายในนโยบายข้อความไฮไลต์ของบริการมีรูปแบบไม่ถูกต้อง หรือมีชื่อโฮสต์ที่ไม่ถูกต้องหรือเข้าถึงไม่ได้
ข้อผิดพลาดเกี่ยวกับเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์แสดงผลการตอบกลับข้อผิดพลาด 4XX หรือ 5XX

สาเหตุ: URL ไม่ถูกต้องหรือมีรูปแบบไม่เป็นมาตรฐาน

URL เป้าหมายในนโยบายข้อความไฮไลต์ของบริการมีรูปแบบไม่ถูกต้อง หรือมีชื่อโฮสต์ที่ไม่ถูกต้องหรือเข้าถึงไม่ได้

การวินิจฉัย

  1. ระบุนโยบายข้อความไฮไลต์ของบริการที่ทำให้เกิดข้อผิดพลาด ชื่อนโยบายจะปรากฏในองค์ประกอบ faultstring ของคำตอบแสดงข้อผิดพลาด ตัวอย่างเช่น ใน faultstring ต่อไปนี้ ชื่อของนโยบายข้อความไฮไลต์บริการที่ล้มเหลวคือ ExecuteGeocodingRequest

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

  2. ในนโยบายข้อความไฮไลต์บริการที่ล้มเหลว ให้ตรวจสอบองค์ประกอบ <URL> หากมีรูปแบบไม่ถูกต้องหรือมีชื่อโฮสต์ที่ไม่ถูกต้องหรือเข้าถึงไม่ได้ ปัญหานี้อาจเกิดจากสาเหตุดังกล่าว ตัวอย่างเช่น นโยบายข้อความไฮไลต์บริการต่อไปนี้ระบุ <URL> ที่ไม่ถูกต้อง

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ServiceCallout name="ExecuteGeocodingRequest">
        <Request variable="GeocodingRequest"/>
        <Response>GeocodingResponse</Response>
        <HTTPTargetConnection>
            <URL>http://</URL>
        </HTTPTargetConnection>
    </ServiceCallout>
    

    องค์ประกอบ <URL> มีเพียงโปรโตคอล http:// แต่ไม่มีชื่อโฮสต์ที่ถูกต้อง นโยบายข้อความไฮไลต์ของบริการจึงดำเนินการไม่สำเร็จพร้อมข้อผิดพลาด Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: Host not reachable

ความละเอียด

ตรวจสอบว่าองค์ประกอบ <URL> ในนโยบายข้อความไฮไลต์บริการที่ไม่ผ่านการตรวจสอบมี URL ที่ถูกต้องซึ่งมีชื่อโฮสต์ที่เข้าถึงได้

หากต้องการแก้ไขนโยบายข้อความไฮไลต์บริการที่แสดงด้านบน คุณสามารถแก้ไของค์ประกอบ <URL> เพื่อระบุ URL ที่ถูกต้องได้

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ServiceCallout name="ExecuteGeocodingRequest">
    <Request variable="GeocodingRequest"/>
    <Response>GeocodingResponse</Response>
    <HTTPTargetConnection>
        <URL>http://maps.googleapis.com/maps/api/geocode/json</URL>
    </HTTPTargetConnection>
</ServiceCallout>

สาเหตุ: ข้อผิดพลาดของเซิร์ฟเวอร์แบ็กเอนด์

เซิร์ฟเวอร์แบ็กเอนด์แสดงการตอบกลับข้อผิดพลาด 4XX หรือ 5XX

การวินิจฉัย

  1. ระบุนโยบายคำขอราคาเสนอบริการที่ทำให้เกิดข้อผิดพลาด ชื่อนโยบายจะปรากฏในองค์ประกอบ faultstring ของคำตอบแสดงข้อผิดพลาด ตัวอย่างเช่น ใน faultstring ต่อไปนี้ ชื่อของนโยบายข้อความไฮไลต์บริการที่ล้มเหลวคือ ExecuteGeocodingRequest

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

  2. ตรวจสอบ faultstring ในเนื้อหาการตอบกลับข้อผิดพลาด และดูว่ามีรหัสการตอบกลับ 4XX หรือ 5XX แสดงอยู่ใน Reason หรือไม่ ตัวอย่างเช่น สตริงข้อผิดพลาดต่อไปนี้บ่งชี้อย่างชัดเจนว่าเซิร์ฟเวอร์แบ็กเอนด์แสดงผลรหัสการตอบกลับ 502

    "faultstring": "Execution of ServiceCallout ExecuteGeocodingRequest failed. Reason: ResponseCode 502 is treated as error"

ความละเอียด

เมื่อทราบรหัสการตอบกลับข้อผิดพลาดแล้ว คุณจะแก้ปัญหานี้ได้เช่นเดียวกับข้อผิดพลาด 4XX หรือ 5XX โปรดดูวิธีการแก้ปัญหาและการแก้ไขข้อผิดพลาด 4XX หรือ 5XX ใน Playbook เกี่ยวกับข้อผิดพลาดรันไทม์ (4XX/5XX)