คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ
Apigee X info
ลักษณะปัญหา
แอปพลิเคชันไคลเอ็นต์จะได้รับรหัสสถานะ HTTP 400 Bad Request พร้อมรหัสข้อผิดพลาด
messaging.adaptors.http.flow.DecompressionFailureAtRequest เป็นการตอบกลับการเรียก API
ข้อความแสดงข้อผิดพลาด
แอปพลิเคชันไคลเอ็นต์จะได้รับโค้ดตอบกลับต่อไปนี้
HTTP/1.1 400 Bad Request
นอกจากนี้ คุณอาจเห็นข้อความแสดงข้อผิดพลาดที่คล้ายกับข้อความที่แสดงด้านล่าง
{
"fault":{
"faultstring":"Decompression failure at request",
"detail":{
"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"
}
}
}สาเหตุที่เป็นไปได้
ข้อผิดพลาดนี้จะเกิดขึ้นในกรณีต่อไปนี้เท่านั้น
- การเข้ารหัสที่ระบุในส่วนหัวคำขอ HTTP
Content-Encodingถูกต้องและ รองรับโดย Apigee Edge - รูปแบบเพย์โหลดที่ไคลเอ็นต์ส่งเป็นส่วนหนึ่งของคำขอ HTTP ไม่ตรงกับรูปแบบการเข้ารหัสที่ระบุไว้ในส่วนหัว
Content-Encoding
แต่
เนื่องจาก Apigee Edge ถอดรหัสเพย์โหลดโดยใช้การเข้ารหัสที่ระบุไม่สำเร็จ เนื่องจากรูปแบบของเพย์โหลดไม่ได้อยู่ในรูปแบบเดียวกับการเข้ารหัสที่ระบุในส่วนหัว Content-Encoding
ต่อไปนี้คือตัวอย่างค่า Content-Encoding ที่รองรับและวิธีที่ Apigee Edge
คาดหวังว่ารูปแบบเพย์โหลดจะเป็นในกรณีเหล่านั้น
| สถานการณ์ | Content-Encoding | รูปแบบเพย์โหลดที่คาดไว้ |
|---|---|---|
| การเข้ารหัสแบบเดี่ยว | gzip | รูปแบบ Unix |
| การเข้ารหัสแบบเดี่ยว | deflate | รูปแบบนี้ใช้โครงสร้าง |
| การเข้ารหัสหลายรายการ | การเข้ารหัสหลายรายการ ตัวอย่างเช่น ในกรณีที่เข้ารหัส 2 ครั้ง อาจเป็นดังนี้
|
การเข้ารหัสหลายรายการที่ใช้กับเพย์โหลดตามลำดับที่ปรากฏในส่วนหัว |
สาเหตุที่เป็นไปได้ของข้อผิดพลาดนี้มีดังนี้
| สาเหตุ | คำอธิบาย | วิธีการแก้ปัญหาที่ใช้ได้กับ |
|---|---|---|
| รูปแบบเพย์โหลดคำขอไม่ตรงกับการเข้ารหัสที่ระบุในส่วนหัว Content-Encoding | รูปแบบของเพย์โหลดคำขอที่ไคลเอ็นต์ส่งมาไม่ได้เข้ารหัสหรือ
ไม่ตรงกับการเข้ารหัสที่ระบุไว้ในส่วนหัว Content-Encoding |
ผู้ใช้ Edge Public และ Private Cloud |
ขั้นตอนการวินิจฉัยที่พบบ่อย
ใช้เครื่องมือ/เทคนิคอย่างใดอย่างหนึ่งต่อไปนี้เพื่อวินิจฉัยข้อผิดพลาดนี้
การตรวจสอบ API
วิธีวินิจฉัยข้อผิดพลาดโดยใช้การตรวจสอบ API
- ลงชื่อเข้าใช้ UI ของ Apigee Edge ในฐานะผู้ใช้ที่มี บทบาทที่เหมาะสม
เปลี่ยนไปใช้องค์กรที่คุณต้องการตรวจสอบปัญหา
- ไปที่หน้าวิเคราะห์ > การตรวจสอบ API > ตรวจสอบ
- เลือกกรอบเวลาที่เฉพาะเจาะจงซึ่งคุณพบข้อผิดพลาด
- ตรวจสอบว่าได้ตั้งค่าตัวกรองพร็อกซีเป็นทั้งหมด
- พล็อตรหัสข้อบกพร่องเทียบกับเวลา
เลือกเซลล์ที่มีรหัสข้อบกพร่อง
messaging.adaptors.http.flow.DecompressionFailureAtRequestดังที่ แสดงด้านล่าง
ข้อมูลเกี่ยวกับรหัสข้อบกพร่อง
messaging.adaptors.http.flow.DecompressionFailureAtRequestจะแสดงดังที่แสดงด้านล่าง
คลิกดูบันทึก แล้วขยายแถวที่ล้มเหลวเนื่องจากข้อผิดพลาด
400
- จากหน้าต่างบันทึก ให้จดรายละเอียดต่อไปนี้
- รหัสสถานะ:
400 - แหล่งที่มาของข้อผิดพลาด:
proxy - รหัสข้อบกพร่อง:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
- รหัสสถานะ:
- หาก Fault Source มีค่า
proxyแสดงว่ารูปแบบเพย์โหลดของคำขอไม่ตรงกับ การเข้ารหัสที่รองรับที่ระบุในส่วนหัวContent-Encoding
เครื่องมือติดตาม
วิธีวิเคราะห์ข้อผิดพลาดโดยใช้เครื่องมือติดตาม
- เปิดใช้เซสชันการติดตาม
และรายการใดรายการหนึ่งต่อไปนี้
- รอให้เกิดข้อผิดพลาด
400 Bad Requestหรือ - หากทำให้เกิดปัญหาซ้ำได้ ให้ทำการเรียก API และทำซ้ำ
400 Bad Request
- รอให้เกิดข้อผิดพลาด
ตรวจสอบว่าได้เปิดใช้แสดง FlowInfo ทั้งหมดแล้ว
- เลือกคำขอที่ล้มเหลวรายการใดรายการหนึ่ง แล้วตรวจสอบการติดตาม
- ไปยังส่วนต่างๆ ของการติดตาม และค้นหาตำแหน่งที่เกิดข้อผิดพลาด
โดยปกติแล้ว คุณจะเห็นข้อผิดพลาดในโฟลว์หลังจากระยะได้รับคำขอจากไคลเอ็นต์ดังที่แสดงด้านล่าง
-
จดค่าของพร็อพเพอร์ตี้จากร่องรอย
- ข้อผิดพลาด:
Decompression failure at request - error.class:
com.apigee.rest.framework.BadRequestException - error.cause:
Not in GZIP format
error.cause ระบุว่าเพย์โหลดคำขอไม่ได้อยู่ในรูปแบบ GZIP ซึ่งหมายความว่า Apigee Edge คาดหวังว่าเพย์โหลดของคำขอจะอยู่ในรูปแบบ GZIP เนื่องจากมีการระบุไว้ในส่วนหัว
Content-Encoding - ข้อผิดพลาด:
กำหนดค่าของส่วนหัวของคำขอ
Content-Encodingโดยไปที่ระยะได้รับคำขอจากลูกค้าตามที่แสดงด้านล่าง
โปรดทราบว่าค่าของส่วนหัวคำขอ
Content-Encodingคือgzipการติดตามตัวอย่างข้างต้นแสดงให้เห็นว่าการเข้ารหัสที่ระบุในส่วนหัวของคำขอ
Content-Encodingคือgzipแต่เพย์โหลดของคำขอ ไม่ได้อยู่ในรูปแบบ GZIP ดังนั้น Apigee จึงไม่สามารถคลายการบีบอัดเพย์โหลดโดยใช้ gzip และแสดงข้อผิดพลาดDecompression failure at request- จดรหัสสถานะและข้อความแสดงข้อผิดพลาดที่ Apigee Edge ส่งกลับมาโดยไปที่
เป็นระยะส่งการตอบกลับไปยังไคลเอ็นต์ในร่องรอย ดังที่แสดงด้านล่าง
โปรดทราบรายละเอียดต่อไปนี้จากร่องรอย
- รหัสสถานะ:
400 Bad Request - เนื้อหาข้อผิดพลาด:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- รหัสสถานะ:
ไปที่เฟส AX (บันทึกข้อมูลวิเคราะห์) ในการติดตาม แล้วคลิก
- เลื่อนลงไปที่ส่วนรายละเอียดระยะ ส่วนหัวของข้อผิดพลาด และ
กำหนดค่าของ X-Apigee-fault-code และ X-Apigee-fault-source
ตามที่แสดงด้านล่าง
- คุณจะเห็นค่าของ X-Apigee-fault-code และ X-Apigee-fault-source
เป็น
messaging.adaptors.http.flow.DecompressionFailureAtRequestและpolicyซึ่งบ่งชี้ว่ารูปแบบเพย์โหลดของคำขอไม่ตรงกับ การเข้ารหัสที่ระบุในส่วนหัวContent-Encodingส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
NGINX
วิธีวินิจฉัยข้อผิดพลาดโดยใช้บันทึกการเข้าถึง NGINX
- หากเป็นผู้ใช้ Private Cloud คุณจะใช้บันทึกการเข้าถึง NGINX เพื่อ
ระบุข้อมูลสำคัญเกี่ยวกับข้อผิดพลาด HTTP
400ได้ ตรวจสอบบันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logตำแหน่ง: ORG, ENV และ PORT# จะถูกแทนที่ด้วยค่าจริง
- ค้นหาเพื่อดูว่ามี
400ข้อผิดพลาดในช่วงระยะเวลาที่เฉพาะเจาะจง (หากปัญหาเกิดขึ้นในอดีต) หรือมีคำขอที่ยังคงล้มเหลวด้วย400หรือไม่ หากพบข้อผิดพลาด
400ที่มี X-Apigee-fault-code ซึ่งตรงกับค่าของmessaging.adaptors.http.flow.DecompressionFailureAtRequestให้พิจารณาค่าของ X-Apigee-fault-sourceตัวอย่างข้อผิดพลาด 400 จากบันทึกการเข้าถึงของ NGINX
รายการตัวอย่างข้างต้นจากบันทึกการเข้าถึง NGINX มีค่าต่อไปนี้สำหรับ X-Apigee-fault-code และ X-Apigee-fault-source:
ส่วนหัวการตอบกลับ ค่า X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
สาเหตุ: รูปแบบเพย์โหลดของคำขอไม่ตรงกับการเข้ารหัสที่ระบุ ในส่วนหัว Content-Encoding
โดยค่าเริ่มต้น Apigee Edge จะคลายการบีบอัดเพย์โหลดเสมอหากส่วนหัวของคำขอ
Content-Encoding มี
การเข้ารหัสที่รองรับที่ถูกต้อง ดังนั้นจึงคาดว่ารูปแบบของเพย์โหลดคำขอ
ควรตรงกับการเข้ารหัสที่ระบุในส่วนหัวของคำขอ Content-Encoding
หากข้อมูลไม่ตรงกัน คุณจะได้รับข้อผิดพลาดนี้
การวินิจฉัย
- กำหนดรหัสข้อผิดพลาดและแหล่งที่มาของข้อผิดพลาดสำหรับข้อผิดพลาดที่สังเกตได้โดยใช้ API การตรวจสอบ เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ใน ขั้นตอนการวินิจฉัยที่พบบ่อย
- หากรหัสข้อผิดพลาดคือ
messaging.adaptors.http.flow.DecompressionFailureAtRequestและแหล่งที่มาของข้อผิดพลาดมีค่าเป็นpolicyหรือproxyแสดงว่า คำขอที่แอปพลิเคชันไคลเอ็นต์ส่งมามีเพย์โหลดที่ไม่ตรงกับ การเข้ารหัสที่รองรับที่ระบุในส่วนหัวของคำขอContent-Encoding คุณสามารถระบุความไม่ตรงกันเป็นส่วนหนึ่งของคำขอ HTTP โดยใช้วิธีใดวิธีหนึ่งต่อไปนี้
ข้อความแสดงข้อผิดพลาด
วิธียืนยันโดยใช้ข้อความแสดงข้อผิดพลาด
-
หากคุณมีสิทธิ์เข้าถึงข้อความแสดงข้อผิดพลาดทั้งหมดที่ได้รับจาก Apigee Edge ให้ ดู
faultstringตัวอย่างข้อความแสดงข้อผิดพลาด:
"faultstring":"Decompression failure at request"
- ในข้อความแสดงข้อผิดพลาดข้างต้น จะแสดง
"Decompression failure at request"ซึ่งหมายความว่าคำขอ ไม่สามารถยกเลิกการบีบอัดโดยใช้การเข้ารหัสที่ระบุในส่วนหัวContent-Encoding
Trace
วิธีตรวจสอบโดยใช้การติดตาม
- กำหนดค่าของส่วนหัวของคำขอ Content-Encoding และพร็อพเพอร์ตี้ error.cause โดยใช้ Trace ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
ค่าจากตัวอย่างการติดตามมีดังนี้
- Content-Encoding:
gzip - error.cause:
Not in GZIP format
ค่าในส่วนหัวของคำขอ Content-Encoding คือ gzip แต่เพย์โหลดของคำขอไม่ได้อยู่ในรูปแบบ GZIP (ตามที่ระบุโดย error.cause) ดังนั้น Apigee Edge จึงตอบกลับด้วย
400 Bad Requestและรหัสข้อผิดพลาดmessaging.adaptors.http.flow.DecompressionFailureAtRequest- Content-Encoding:
คำขอจริง
วิธีตรวจสอบโดยใช้คำขอจริง
หากคุณมีสิทธิ์เข้าถึงคำขอจริงที่แอปพลิเคชันไคลเอ็นต์ส่งมา ให้ทำตามขั้นตอนต่อไปนี้
- กำหนดค่าที่ส่งไปยังส่วนหัวของคำขอ
Content-Encoding - กำหนดรูปแบบของเพย์โหลดที่ส่งเป็นส่วนหนึ่งของคำขอ
หากค่าของส่วนหัว
Content-Encodingอยู่ในรายการ การเข้ารหัสที่รองรับ แต่รูปแบบของเพย์โหลดคำขอไม่ ตรงกับการเข้ารหัสที่ระบุไว้ในส่วนหัวContent-Encodingนั่นคือสาเหตุของปัญหาตัวอย่างคำขอ:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"-X POST -d @request_payload.zipคำขอตัวอย่างข้างต้นจะส่งค่า
gzipไปยังส่วนหัวContent-Encodingซึ่งเป็น การเข้ารหัสที่รองรับใน Apigee Edge อย่างไรก็ตาม เพย์โหลดของคำขอrequest_payload.zipจะอยู่ในรูปแบบ ZIP ดังนั้น คำขอนี้จะ ล้มเหลวโดยมีรหัสสถานะ400 Bad Requestและรหัสข้อผิดพลาดmessaging.adaptors.http.flow.DecompressionFailureAtRequest
บันทึกของ Message Processor
วิธีตรวจสอบความถูกต้องโดยใช้บันทึกของ Message Processor
หากเป็นผู้ใช้ Private Cloud คุณจะใช้บันทึกของ Message Processor เพื่อระบุข้อมูลสำคัญเกี่ยวกับข้อผิดพลาดของ HTTP
400ได้- กำหนดรหัสข้อความของคำขอที่ไม่สำเร็จโดยใช้การตรวจสอบ API, เครื่องมือติดตาม หรือบันทึกการเข้าถึง NGINX ตามที่อธิบายไว้ในขั้นตอนการวินิจฉัยทั่วไป
ค้นหารหัสข้อความในบันทึกของ Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.logคุณจะเห็นข้อยกเว้นข้อใดข้อหนึ่งต่อไปนี้
สถานการณ์ที่ 1
สถานการณ์ #1: เมื่อคำขอ API มีส่วนหัว Content-Encoding: gzip
2021-07-28 10:21:16,861 NIOThread@0 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-57-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739893ms lastIO=0ms isOpen=true.onExceptionRead exception: {} java.util.zip.ZipException: Not in GZIP format 2021-07-28 10:21:16,862 NIOThread@0 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rt-57-1, exception:java.util.zip.ZipException: Not in GZIP format, context:Context@71ea5ac input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.80.234:44284]@28469 useCount=1 bytesRead=0 bytesWritten=28764 age=2739894ms lastIO=0ms isOpen=true) 2021-07-28 10:21:16,862 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exceptionjava.util.zip.ZipException: Not in GZIP formatoccurred while writing to channel null 2021-07-28 10:21:16,863 NIOThread@0 INFO HTTP.SERVICE - ExceptionHandler.handleException() : Exception trace: java.util.zip.ZipException: Not in GZIP formatบรรทัด
java.util.zip.ZipException: Not in GZIP formatในข้อความแสดงข้อผิดพลาดข้างต้นบ่งชี้ว่าไม่ได้ส่งเพย์โหลดคำขอในรูปแบบ GZIP แม้ว่าจะระบุContent-Encodingเป็น gzip ก็ตาม ดังนั้น Apigee Edge จึงจะส่งข้อยกเว้นและ แสดงรหัสสถานะ400พร้อมรหัสข้อผิดพลาดmessaging.adaptors.http.flow.DecompressionFailureAtRequestไปยังแอปพลิเคชันไคลเอ็นต์สถานการณ์ที่ 2
สถานการณ์ที่ 2: เมื่อคำขอ API มีส่วนหัว Content-Encoding: deflate
2021-07-28 15:26:31,893 NIOThread@1 ERROR HTTP.SERVER - HTTPServer$Context.onInputException() : Message id:rt-47875-1 SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 bytesRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true.onExceptionRead exception: {}java.util.zip.ZipException: incorrect header check….Caused by: java.util.zip.DataFormatException: incorrect header check.. 2021-07-28 15:26:31,894 NIOThread@1 ERROR ADAPTORS.HTTP.FLOW - AbstractRequestListener.onException() : Request:POST, uri:/test, message Id:rrt-47875-1, exception:java.util.zip.ZipException: incorrect header check, context:Context@69b3ac45 input=ClientInputChannel(SSLClientChannel[Accepted: Remote:192.168.199.8:8443 Local:192.168.81.72:45954]@29276 useCount=1 byt esRead=0 bytesWritten=37230 age=3498856ms lastIO=1ms isOpen=true)บรรทัด
java.util.zip.ZipException: incorrect header checkและCaused by: java.util.zip.DataFormatException: incorrect header checkในข้อความแสดงข้อผิดพลาดด้านบนบ่งชี้ว่าไม่ได้ส่งเพย์โหลดคำขอใน รูปแบบ Deflate และไม่ตรงกับการเข้ารหัสที่ระบุในส่วนหัวContent-Encodingของ Deflate ดังนั้น Apigee Edge จึงทิ้งข้อยกเว้นและแสดงรหัสสถานะ400พร้อม รหัสข้อผิดพลาดmessaging.adaptors.http.flow.DecompressionFailureAtRequestไปยังแอปพลิเคชันไคลเอ็นต์
-
ความละเอียด
- หากไม่จำเป็นต้องใช้เพย์โหลดคำขอที่บีบอัดในโฟลว์พร็อกซี API ใน Apigee Edge
และในเซิร์ฟเวอร์แบ็กเอนด์ อย่าส่งส่วนหัว
Content-Encodingหากจำเป็นต้องบีบอัดเพย์โหลดคำขอ ให้ไปที่ขั้นตอนที่ 2 - ตรวจสอบว่าแอปพลิเคชันไคลเอ็นต์ส่งข้อมูลต่อไปนี้เสมอ
- ในตัวอย่างที่กล่าวถึงข้างต้น เพย์โหลดของคำขออยู่ในรูปแบบ ZIP แต่ส่วนหัวของคำขอ
ระบุ
Content-Encoding: gzipคุณแก้ไขปัญหานี้ได้โดยส่งส่วนหัวของคำขอเป็นContent-Encoding: gzipและเพย์โหลดของคำขอในรูปแบบgzipด้วยcurl -v "https://HOSTALIAS/v1/testgzip" -H "Content-Encoding: gzip" -X POST -d @request_payload.gz
ข้อมูลจำเพาะ
Apigee Edge จะตอบกลับด้วยรหัสสถานะ 400 Bad Request พร้อมรหัสข้อผิดพลาด
messaging.adaptors.http.flow.DecompressionFailureAtRequest ตามข้อกำหนด RFC
ต่อไปนี้
| ข้อมูลจำเพาะ |
|---|
| RFC 7231, ส่วน 6.5.1 |
| RFC 7231, ส่วน 3.1.2.2 |
หากยังต้องการความช่วยเหลือจากทีมสนับสนุนของ Apigee โปรดไปที่ ต้องรวบรวมข้อมูลการวินิจฉัย
ต้องรวบรวมข้อมูลการวินิจฉัย
รวบรวมข้อมูลการวินิจฉัยต่อไปนี้ แล้วติดต่อทีมสนับสนุน Apigee Edge
หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดระบุข้อมูลต่อไปนี้
- ชื่อองค์กร
- ชื่อสภาพแวดล้อม
- ชื่อพร็อกซี API
- คำสั่ง
curlที่สมบูรณ์ซึ่งใช้ในการสร้างข้อผิดพลาด400ซ้ำ - ไฟล์การติดตามสำหรับคำขอ API
หากคุณเป็นผู้ใช้ Private Cloud โปรดระบุข้อมูลต่อไปนี้
- ข้อความแสดงข้อผิดพลาดทั้งหมดที่พบสำหรับคำขอที่ไม่สำเร็จ
- ชื่อสภาพแวดล้อม
- แพ็กเกจพร็อกซี API
- ไฟล์การติดตามสำหรับคำขอ API
บันทึกการเข้าถึง NGINX
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logโดยที่ ORG, ENV และ PORT# จะแทนที่ด้วย ค่าจริง
- บันทึกของระบบ Message Processor
/opt/apigee/var/log/edge-message-processor/logs/system.log