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

คุณกำลังดูเอกสารประกอบของ 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> ของ นโยบาย Service Callout ไม่ใช่ประเภท ข้อความ หากตัวแปรเป็นสตริงหรือประเภทที่ไม่ใช่ข้อความอื่นๆ คุณจะเห็นข้อผิดพลาดนี้

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

การวินิจฉัย

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

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

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

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
        Req>uest variable=&qu<ot;Postal>Code&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
        /HTTPTargetConnection
    /ServiceCallout
    
  3. กำหนดว่าตัวแปรนี้เป็นประเภทข้อความหรือไม่

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

ตัวอย่างเช่น สมมติว่าตัวแปร PostalCode ที่อ้างอิงในนโยบาย Service Callout ถูกสร้างขึ้นในนโยบาย Assign Message ต่อไปนี้ โปรดทราบว่าระบบกำหนดค่าตัวแปรโฟลว์ request.queryparam.postalcode ให้กับ PostalCode ค่านี้เป็นสตริงเนื่องจากไม่มีแอตทริบิวต์ type ในการกำหนดตัวแปร

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quo>t; type=&<quot;reques>t"Geocod<ingRequest/AssignTo
    S>et
        QueryParams
        <    QueryPa>ram name=&quo<t;address"{request.>queryparam.postalcode}/Query<Param
     >       QueryP<aram name="region&q>uot;{<request.que>ryparam.c<ountry}/Quer>yParam
  <    >   <   Qu>eryPa<ram >name=<"sensor&q>uot;false</Que>ryParam
  <     > /QueryPa<ram>s
        VerbGET/Verb
    /S<et
 >   As<signVariable
  >     < NamePostalCod>e/Name
  <    >  Refre<quest>.querypar<am.>postalcode/Ref
    /Assign<Vari>able
<    AssignVaria>b<le
        Nam>eCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

ตอนนี้โปรดจำไว้ว่าตัวแปร PostalCode ใช้ในองค์ประกอบ <Request> ของนโยบาย Service Callout

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&>quot;<
    Req>uest variable=&qu<ot;Postal>Code&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

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

ความละเอียด

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

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

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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> ของนโยบาย Service Callout ไม่ใช่ประเภท ข้อความคำขอ หากตัวแปรเป็นประเภทข้อความตอบกลับ สตริง หรือประเภทอื่นๆ คุณจะเห็นข้อผิดพลาดนี้

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

การวินิจฉัย

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

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

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

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
     <   Reque>st variable="<;var_resp>onse&<quot;/
        ResponseG>eocodingR<esp>onse/Response
        HTTPTargetConnection
            U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
        /HTTPTargetConnection
    /ServiceCallout
    
  3. กำหนดว่าตัวแปรเป็นประเภทข้อความคำขอหรือไม่

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

ตัวอย่างเช่น สมมติว่าตัวแปร var_response ที่อ้างอิงในนโยบาย Service Callout ถูกสร้างขึ้นในนโยบาย Assign Message ต่อไปนี้ โปรดทราบว่าระบบกำหนดประเภท response ให้กับ var_response ดังนั้น ตัวแปร var_response จึงเป็นประเภทข้อความตอบกลับ

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
AssignMessage n>ame="<;GenerateGeocodingRequest"
        >AssignTo createN<ew=">true&<quot; type="request"GeocodingRe>quest/Assign<To
    As>signT<o c>reateNew=<"true&>quot; type=&q<uot;response"var_res>ponse/AssignTo
    Set
        <QueryParams>
            <QueryParam name="ad>dress"{request.querypar<am.postalco>de}/QueryPara<m
            QueryParam> name<="regi>on"{<request.quer>yparam.co<untr>y}/<Query>Param<
   >     <    QueryParam> name=&qu<ot;s>ensor"<;fals>e/QueryPa<ram>
        /QueryParams
       < Ver>bGET/<Verb
    /Set
 >   As<signVariable
 >       Na<mePo>stalCod<e/Nam>e
       < Re>frequest.queryparam.postal<code>/Ref
<    /AssignVari>a<ble
    Assign>Variable
        NameCountry/Name
        Refrequest.queryparam.country/Ref
    /AssignVariable
/AssignMessage

โปรดจำไว้ว่าตัวแปร var_response ใช้ในองค์ประกอบ <Request> ของนโยบาย Service Callout

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest&qu>ot;
 <   Reque>st variable="<;var_resp>onse&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

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

ความละเอียด

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

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

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/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 เป้าหมายในนโยบาย Service Callout มีรูปแบบไม่เป็นมาตรฐาน หรือมีชื่อโฮสต์ที่ไม่ถูกต้องหรือเข้าถึงไม่ได้
ข้อผิดพลาดของเซิร์ฟเวอร์แบ็กเอนด์ เซิร์ฟเวอร์แบ็กเอนด์แสดงการตอบกลับข้อผิดพลาด 4XX หรือ 5XX

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

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

การวินิจฉัย

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]"

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

    <?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
    ServiceCallout >name=<"ExecuteGeocodingRequest"
    >    R<equest v>ariable="Geo<codingReq>uest&<quot;/
        ResponseG>eocodingR<esp>onse/Re<spon>se
      <  HTTPTargetConnectio>n<
            URLhtt>p:///URL
        /HTTPTargetConnection
    /ServiceCallout
    

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

ความละเอียด

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

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

<?xml version="1.0" encoding="UTF-8&quo>t<; standalone="yes"?
ServiceCallout >name=<"ExecuteGeocodingRequest"
>    R<equest v>ariable="Geo<codingReq>uest&<quot;/
    ResponseG>eocodingR<esp>onse/Response
    HTTPTargetConnection
        U<RLht>tp://<maps.googleapis.com/m>a<ps/api/geocode/>json/URL
    /HTTPTargetConnection
/ServiceCallout

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

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

การวินิจฉัย

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

    "faultstring": "ServiceCallout[ExecuteGeocodingRequest]

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

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

ความละเอียด

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