คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP เป็น 500 Internal Server Error
พร้อมรหัสข้อผิดพลาด protocol.http.EmptyPath
เป็นการตอบกลับสำหรับการเรียก API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 500 Internal Server Error
นอกจากนี้ คุณอาจพบข้อความแสดงข้อผิดพลาดต่อไปนี้
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
สาเหตุที่เป็นไปได้
ข้อผิดพลาดนี้จะเกิดขึ้นหาก URL คำขอของเซิร์ฟเวอร์แบ็กเอนด์ที่แสดงโดยตัวแปรโฟลว์
target.url
มีเส้นทางที่ว่างเปล่า
ตามข้อกำหนดเฉพาะ RFC 3986 ส่วนที่ 3: คอมโพเนนต์ไวยากรณ์ และ RFC 3986 ส่วนที่ 3.3: เส้นทาง
ไวยากรณ์ URI มีคอมโพเนนต์ต่อไปนี้
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- คุณต้องระบุคอมโพเนนต์
path
และต้องมีเครื่องหมายทับ (/
) เสมอ แม้จะไม่มีอักขระอื่นๆ เป็นส่วนหนึ่งของเส้นทางก็ตาม
ดังนั้น หาก URL คำขอของเซิร์ฟเวอร์แบ็กเอนด์ไม่มีคอมโพเนนต์ path
เลย กล่าวคือไม่มีเครื่องหมายทับ (/
) Apigee Edge จะตอบกลับด้วย 500 Internal Server Error
และรหัสข้อผิดพลาด protocol.http.EmptyPath
เช่น หาก target.url
มีค่า https://www.mocktarget.apigee.net
ข้อผิดพลาดนี้จะเกิดขึ้นเนื่องจาก path
คอมโพเนนต์ว่างเปล่าหรือขาดหายไป
สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้กับ |
---|---|---|
URL ของเซิร์ฟเวอร์แบ็กเอนด์ (target.url) มีเส้นทางที่ว่างเปล่า | URL เซิร์ฟเวอร์แบ็กเอนด์ที่แสดงด้วยตัวแปรโฟลว์ target.url มีเส้นทางที่ว่างเปล่า |
ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยทั่วไป
ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวิเคราะห์ข้อผิดพลาดนี้
การตรวจสอบ API
ขั้นตอนที่ 1: การใช้ API Monitoring
วิธีวินิจฉัยข้อผิดพลาดโดยใช้ API Monitoring
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มีบทบาทที่เหมาะสม
เปลี่ยนเป็นองค์กรที่คุณต้องการตรวจสอบปัญหา
- ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาเฉพาะที่คุณพบข้อผิดพลาด
พล็อตโค้ดข้อผิดพลาดเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อผิดพลาด
protocol.http.EmptyPath
ดังที่แสดงด้านล่างข้อมูลเกี่ยวกับรหัสข้อผิดพลาด
protocol.http.EmptyPath
จะแสดงอยู่ดังที่แสดงด้านล่างคลิกดูบันทึก เพื่อขยายแถวสำหรับคำขอที่ไม่สำเร็จ
- ดูรายละเอียดต่อไปนี้จากหน้าต่าง Logs
- รหัสสถานะ:
500
- แหล่งที่มาของข้อผิดพลาด:
target
- รหัสข้อผิดพลาด:
protocol.http.EmptyPath
- รหัสสถานะ:
- หากแหล่งที่มาของข้อผิดพลาดคือ
target
และรหัสข้อผิดพลาดคือprotocol.http.EmptyPath
แสดงว่า URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางที่ว่างเปล่า
Trace
ขั้นตอนที่ 2: การใช้เครื่องมือติดตาม
วิธีวินิจฉัยข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตามและ
- รอจนกว่าจะเกิดข้อผิดพลาด
500 Internal Server Error
หรือ - หากทำให้ปัญหาเกิดซ้ำได้ ให้เรียก API เพื่อจำลองปัญหา
500 Internal Server Error
- รอจนกว่าจะเกิดข้อผิดพลาด
ตรวจสอบว่าเปิดใช้ Show FlowInfos ทั้งหมดแล้ว โดยทำดังนี้
- เลือกคำขอที่ล้มเหลว 1 รายการและตรวจสอบการติดตาม
- เลื่อนดูการติดตามระยะต่างๆ และค้นหาตำแหน่งที่เกิดข้อผิดพลาด
คุณจะเห็นข้อผิดพลาดโดยทั่วไปในขั้นตอนหลังช่วงเริ่มต้นโฟลว์คำขอเป้าหมายดังที่แสดงด้านล่าง
บันทึกค่าของข้อผิดพลาดจากการติดตาม
ข้อผิดพลาด: ต้องระบุเส้นทางคำขอ
เนื่องจากข้อผิดพลาดเกิดขึ้นโดย Apigee Edge หลังช่วงเริ่มต้นโฟลว์คำขอเป้าหมาย จึงบ่งชี้ว่า
path
ใน URL เซิร์ฟเวอร์แบ็กเอนด์ว่างเปล่า กรณีนี้อาจเกิดขึ้นอย่างมากหากตัวแปรโฟลว์target.url
(ซึ่งแสดง URL สำหรับเซิร์ฟเวอร์แบ็กเอนด์) ได้รับการอัปเดตด้วยเส้นทางว่างผ่านนโยบายใดนโยบายหนึ่งในโฟลว์คําขอ- ตรวจสอบส่วนอ่านและกำหนดตัวแปรในแต่ละกระบวนการที่ย้อนกลับจากจุดแสดงข้อผิดพลาดไปยังช่วงเริ่มต้นโฟลว์คำขอเป้าหมาย
กำหนดนโยบายที่จะอัปเดตตัวแปรโฟลว์
target.url
การติดตามตัวอย่างที่แสดงนโยบาย JavaScript ได้อัปเดตตัวแปรโฟลว์
target.url
:ในการติดตามตัวอย่างที่แสดงข้างต้น โปรดทราบว่าระบบจะอัปเดตค่าของตัวแปรโฟลว์
target.url
ในนโยบาย JavaScript ที่ชื่อว่า SetTargetURL ดังนี้target.url : https://mocktarget.apigee.net
- โปรดทราบว่า
target.url
มีคอมโพเนนต์ต่อไปนี้- แบบแผน:
https://mocktarget.apigee.net
- path: ว่างเปล่า
- แบบแผน:
- ดังนั้น คุณจะได้รับข้อผิดพลาด
Request path cannot be empty
- ไปที่เฟส AX (บันทึกข้อมูล Analytics) ในการติดตามแล้วคลิกเลือกดังกล่าว
เลื่อนลงไปที่ส่วน Phase Details - Error Headers และระบุค่าของ X-Apigee-fault-code และ X-Apigee-fault-source ดังที่แสดงด้านล่าง
- คุณจะเห็นค่าของ X-Apigee-fault-code และ X-Apigee-fault-source เป็น
protocol.http.EmptyPath
และtarget
ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดนี้เกิดจาก URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางที่ว่างเปล่าส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
ขั้นตอนที่ 3: การใช้บันทึกการเข้าถึง NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX
- หากเป็นผู้ใช้ Private Cloud คุณจะใช้บันทึกการเข้าถึง NGINX เพื่อระบุข้อมูลคีย์เกี่ยวกับ HTTP
500 Internal Server Error
ได้ ตรวจสอบบันทึกการเข้าถึง NGINX ดังนี้
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- ค้นหาเพื่อดูว่ามีข้อผิดพลาด
500
ที่มีรหัสข้อผิดพลาดprotocol.http.EmptyPath
ในช่วงเวลาที่ระบุหรือไม่ (หากเกิดปัญหาในอดีต) หรือมีคำขอใดที่ยังคงดำเนินการไม่สำเร็จเมื่อใช้500
หากพบข้อผิดพลาด
500
ที่ X-Apigee-fault-code ตรงกับค่าของprotocol.http.EmptyPath
ให้ระบุค่าของ X-Apigee-fault-sourceตัวอย่างข้อผิดพลาด 500 จากบันทึกการเข้าถึง NGINX
ตัวอย่างรายการด้านบนจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X- Apigee-fault-code และ X-Apigee-fault-source
ส่วนหัว ค่า X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
โปรดสังเกตว่าค่าของ X-Apigee-fault-code และ X-Apigee-fault-source คือ
protocol.http.EmptyPath
และtarget
ตามลำดับ ซึ่งหมายความว่าข้อผิดพลาดนี้เกิดจาก URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางว่าง
สาเหตุ: URL ของเซิร์ฟเวอร์แบ็กเอนด์ (target.url) มีเส้นทางที่ว่างเปล่า
การวินิจฉัย
- กำหนด Fault Code และ Fault Source สำหรับ
500 Internal Server Error
โดยใช้การตรวจสอบ API, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป - หาก Fault Code คือ
protocol.http.EmptyPath
และ Fault Source มีค่าtarget
แสดงว่า URL ของเซิร์ฟเวอร์แบ็กเอนด์มีเส้นทางว่าง URL เซิร์ฟเวอร์แบ็กเอนด์จะแสดงด้วยตัวแปรโฟลว์
target.url
ใน Apigee Edge ข้อผิดพลาดนี้มักเกิดขึ้นเมื่อคุณพยายามอัปเดต URL ของเซิร์ฟเวอร์แบ็กเอนด์ กล่าวคือtarget.url
แบบไดนามิกโดยใช้นโยบายใดก็ได้ (ภายในพร็อกซี/ขั้นตอนที่แชร์) ในขั้นตอนการส่งคำขอ "เป้าหมาย" เพื่อให้มีเส้นทางว่าง- พิจารณาว่าตัวแปรโฟลว์
target.url
มีเส้นทางว่างและต้นทางสำหรับค่าจริงหรือไม่ โดยใช้ขั้นตอนใดขั้นตอนหนึ่งต่อไปนี้Trace
การใช้เครื่องมือติดตาม
หากคุณบันทึกการติดตามสำหรับข้อผิดพลาดนี้แล้ว ให้ใช้ขั้นตอนตามที่อธิบายไว้ในการใช้เครื่องมือติดตาม และ
- ตรวจสอบว่า
target.url
มีเส้นทางที่ว่างเปล่าหรือไม่ หากใช่ ให้ดูว่านโยบายใดที่แก้ไขหรืออัปเดตค่าของ
target.url
ให้มีเส้นทางที่ว่างเปล่าการติดตามตัวอย่างที่แสดงนโยบาย JavaScript ได้อัปเดตตัวแปรโฟลว์
target.url:
- ในการติดตามตัวอย่างด้านบน ให้สังเกตว่านโยบาย JavaScript ได้แก้ไขหรืออัปเดตค่าของ
target.url
ให้มีเส้นทางที่ว่างเปล่า - โปรดทราบว่า
target.url
มีคอมโพเนนต์ต่อไปนี้- แบบแผน:
https://mocktarget.apigee.net
- path: ว่างเปล่า
- แบบแผน:
บันทึก
การใช้บันทึกในเซิร์ฟเวอร์บันทึก
- หากไม่มีการติดตามสำหรับข้อผิดพลาดนี้ (ปัญหาที่เกิดเป็นครั้งคราว) ให้ตรวจสอบเพื่อดูว่าคุณได้บันทึกข้อมูลเกี่ยวกับค่าของตัวแปรโฟลว์
target.url
โดยใช้นโยบายต่างๆ เช่น MessageLogging หรือ Serviceที่แตกต่างกัน ไปยังเซิร์ฟเวอร์บันทึกหรือไม่ - หากมีบันทึก ให้ตรวจสอบดังนี้
- ตรวจสอบว่า
target.url
มีเส้นทางที่ว่างเปล่าหรือไม่ และ - ดูว่าคุณระบุนโยบายที่แก้ไข
target.url
ให้มีเส้นทางว่างได้หรือไม่
- ตรวจสอบว่า
พร็อกซี API
การตรวจสอบพร็อกซี API ที่ล้มเหลว
หากไม่มีการติดตามหรือบันทึกสำหรับข้อผิดพลาดนี้ ให้ตรวจสอบพร็อกซี API ที่ล้มเหลวเพื่อหาสิ่งที่แก้ไขหรืออัปเดตตัวแปรโฟลว์
target.url
ให้มีเส้นทางที่ไม่ถูกต้อง โปรดตรวจสอบสิ่งต่อไปนี้- นโยบายภายในพร็อกซี API
- โฟลว์ที่แชร์ซึ่งเรียกใช้จากพร็อกซี
- ตรวจสอบว่า
ตรวจสอบนโยบายเฉพาะ (เช่น AssignMessage หรือ JavaScript) ที่แก้ไขหรืออัปเดตตัวแปรโฟลว์
target.url
อย่างรอบคอบ และหาสาเหตุที่ทำให้target.url
มีเส้นทางว่างตัวอย่างนโยบายที่อัปเดตตัวแปรโฟลว์
target.url
อย่างไม่ถูกต้องให้มีเส้นทางว่างซึ่งนำไปสู่ข้อผิดพลาดนี้ตัวอย่าง #1
ตัวอย่างที่ 1: การอัปเดตนโยบาย JavaScript
target.url
ตัวแปรvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
ในตัวอย่างข้างต้น สังเกตว่าตัวแปรโฟลว์
target.url
ได้รับการอัปเดตด้วยค่าhttps://mocktarget.apigee.net
ที่อยู่ในตัวแปรอื่นurl
โปรดทราบว่า
target.url
มีคอมโพเนนต์ต่อไปนี้- แบบแผน:
https://mocktarget.apigee.net
- path: ว่างเปล่า
เนื่องจากเส้นทางว่างเปล่า Apigee Edge จึงแสดงผล
500 Internal Server Error
ที่มีรหัสข้อผิดพลาดprotocol.http.EmptyPath
ตัวอย่าง #2
ตัวอย่างที่ 2: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร
target.url
รายการvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
ในตัวอย่างข้างต้น สังเกตว่าตัวแปรโฟลว์
target.url
ได้รับการอัปเดตโดยการเชื่อมโยงค่าhttps://mocktarget.apigee.net
ที่มีอยู่ในตัวแปรurl
และ ค่าของตัวแปรอื่นpath
ซึ่งดึงค่ามาจากrequest.header.Path.
หากคุณมีสิทธิ์เข้าถึงคำขอหรือการติดตามจริง คุณจะยืนยันค่าจริงที่ส่งไปยัง
request.header.Path
ได้ตัวอย่างคำขอจากผู้ใช้
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
ในตัวอย่างนี้ เส้นทางส่วนหัวไม่ได้ส่งเป็นส่วนหนึ่งของคำขอ ดังนั้นค่าของเส้นทางตัวแปรในนโยบาย JavaScript จะเป็น
null
ดังนั้น
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
โปรดทราบว่า
target.url
มีคอมโพเนนต์ต่อไปนี้- แบบแผน:
https://mocktarget.apigee.netnull
- path: ว่างเปล่า
ตัวอย่าง #3
ตัวอย่าง #3: นโยบาย AssignMessage ที่อัปเดตตัวแปร
target.url
ผ่านตัวแปรอื่น<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
โปรดทราบว่า
target.url
มีคอมโพเนนต์ต่อไปนี้- แบบแผน:
https://mocktarget.apigee.net
- path: ว่างเปล่า
ในตัวอย่างข้างต้นทั้งหมด เส้นทางใน URL ของเซิร์ฟเวอร์แบ็กเอนด์ซึ่งก็คือ
target.url
ว่างเปล่า ดังนั้น Apigee Edge จึงแสดงผล500 Internal Server Error
ที่มีรหัสข้อผิดพลาดprotocol.http.EmptyPath
- แบบแผน:
ความละเอียด
ตามข้อกำหนดของ
RFC 3986 ส่วนที่ 2: คอมโพเนนต์ไวยากรณ์ ต้องระบุคอมโพเนนต์ path
และต้องมีเครื่องหมายทับ (/) เสมอ แม้ว่าจะไม่มีอักขระอื่นๆ เป็นส่วนหนึ่งของ path
ก็ตาม ทำตามขั้นตอนต่อไปนี้เพื่อแก้ไขปัญหานี้
- ตรวจสอบว่า URL เซิร์ฟเวอร์แบ็กเอนด์ที่แสดงโดยตัวแปรโฟลว์
target.url
มีเส้นทางที่ไม่ว่างเปล่าเสมอ- ในบางกรณี คุณอาจไม่มีชื่อทรัพยากรในเส้นทาง จากนั้นตรวจสอบว่าอย่างน้อยเส้นทางมีเครื่องหมายทับ (
/
) - หากคุณใช้ตัวแปรอื่นในการกำหนดค่าของตัวแปรโฟลว์
target.url
ให้ตรวจสอบว่าตัวแปรอื่นๆ ไม่มีเส้นทางว่าง - หากคุณดำเนินการสตริงเพื่อระบุค่าของตัวแปรโฟลว์
target.url
ให้ตรวจสอบว่าผลลัพธ์หรือผลลัพธ์ของการดำเนินการสตริงไม่มีเส้นทางว่าง
- ในบางกรณี คุณอาจไม่มีชื่อทรัพยากรในเส้นทาง จากนั้นตรวจสอบว่าอย่างน้อยเส้นทางมีเครื่องหมายทับ (
- ในตัวอย่างที่กล่าวถึงในการวิเคราะห์ คุณแก้ไขปัญหานี้ได้ตามที่อธิบายไว้ด้านล่าง
ตัวอย่าง #1
ตัวอย่าง #1: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร
target.url
รายการเพิ่มเครื่องหมายทับ (
/
) ลงในตัวแปรurl
เพื่อแก้ไขปัญหานี้ ดังที่แสดงด้านล่างvar url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
ตัวอย่าง #2
ตัวอย่างที่ 2: การอัปเดตนโยบาย JavaScript สำหรับตัวแปร
target.url
รายการvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
ตรวจสอบว่าคุณส่งเส้นทางที่ถูกต้อง เช่น
/iloveapis
เป็นส่วนหนึ่งของส่วนหัวของคำขอPath
เพื่อแก้ไขปัญหานี้ดังที่แสดงด้านล่างตัวอย่างคำขอ
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
ตัวอย่าง #3
ตัวอย่างที่ 3: นโยบาย AssignMessage ที่อัปเดตตัวแปร
target.url
ผ่านตัวแปรอื่นเพิ่มเส้นทางที่ถูกต้องในองค์ประกอบ
<Value>
ของนโยบาย AssignMessage เช่น คุณอาจมี/json
เป็นเส้นทางสำหรับ MockTarget API กล่าวคือ ให้แก้ไของค์ประกอบ<Value>
เป็นhttps://mocktarget.apigee.net/json
ดังที่แสดงด้านล่าง<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
ข้อมูลจำเพาะ
Apigee Edge คาดหวังว่า URL เซิร์ฟเวอร์แบ็กเอนด์ ไม่มีเส้นทางว่างตามข้อกำหนดต่อไปนี้
ข้อมูลจำเพาะ |
---|
RFC 3986 ส่วนที่ 3: คอมโพเนนต์ไวยากรณ์ |
RFC 3986 ส่วนที่ 3.3: เส้นทาง |
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee ให้ไปที่หัวข้อต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
หากปัญหายังคงอยู่แม้ว่าจะทำตามวิธีการข้างต้นแล้ว ให้รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ จากนั้นติดต่อฝ่ายสนับสนุนของ Apigee Edge
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- ใช้คำสั่ง
curl
เพื่อทำซ้ำ500 Internal Server Error
ที่มีรหัสข้อผิดพลาดprotocol.http.EmptyPath
- ไฟล์การติดตามสำหรับคำขอ API
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- สังเกตข้อความแสดงข้อผิดพลาดสำหรับคำขอที่ไม่สำเร็จ
- ชื่อสภาพแวดล้อม
- ชุดพร็อกซี API
- ไฟล์การติดตามสำหรับคำขอ API
บันทึกการเข้าถึง NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
ที่ไหน จะแทนที่ ORG, ENV และ PORT# ด้วยค่าจริง
- บันทึกระบบของผู้ประมวลผลข้อความ
/opt/apigee/var/log/edge-message- processor/logs/system.log