כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של
Apigee X. מידע
תיאור הבעיה
אפליקציית הלקוח מקבלת קוד סטטוס 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 לא מצליח לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין מאחר שהפורמט של המטען הייעודי הוא לא בפורמט זהה לזה של הקידוד שצוין
בכותרת Content-Encoding
.
בהמשך מפורטות כמה דוגמאות לערכים נתמכים של Content-Encoding
, ואיך Apigee Edge
מצפה שפורמט המטען הייעודי (payload) יהיה במקרים האלה:
תרחיש | קידוד תוכן | הפורמט הצפוי של המטען הייעודי (payload) |
---|---|---|
קידוד יחיד | gzip | פורמט Unix פרטים נוספים זמינים במאמר פורמט RFC1952 GZIP. |
קידוד יחיד | deflate | בפורמט הזה נעשה שימוש במבנה |
קידוד מרובה | קידוד מרובה לדוגמה, במקרים שבהם הקידוד מתבצע פעמיים, הוא עשוי להיות:
|
הופעלו כמה קידודים על המטען הייעודי (payload) בסדר הנתון כפי שהוא מופיע בכותרת. |
אלה הסיבות האפשריות לשגיאה הזו:
סיבה | תיאור | ההוראות לפתרון בעיות הרלוונטיות עבור |
---|---|---|
הפורמט של המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding | הפורמט של המטען הייעודי (payload) של הבקשה שנשלח על ידי הלקוח לא מקודד או
לא תואם לקידוד שצוין בכותרת Content-Encoding . |
משתמשי Edge הציבוריים והפרטיים |
שלבים נפוצים באבחון
אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:
מעקב באמצעות API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
עוברים לארגון שבו רוצים לבדוק את הבעיה.
- עוברים לדף ניתוח > API Monitoring > חקירה.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שמסנן שרת ה-Proxy מוגדר לערך הכול.
- יש להציב את קוד השגיאה ביחס ל-Time.
צריך לבחור תא שמכיל את קוד השגיאה
messaging.adaptors.http.flow.DecompressionFailureAtRequest
כפי שמוצג כאן:מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtRequest
מוצג באופן שמוצג למטה:לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה שבה הופיעה השגיאה
400
.- בחלון Logs, שימו לב לפרטים הבאים:
- קוד סטטוס:
400
- מקור התקלה:
proxy
- קוד תקלה:
messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
- קוד סטטוס:
- אם הערך
proxy
מופיע ב-Fault Source, סימן שפורמט המטען הייעודי של הבקשה לא תואם לקידוד הנתמך שצוין בכותרתContent-Encoding
.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את הפעלת המעקב
וגם:
- להמתין עד שהשגיאה
400 Bad Request
תתרחש, או - אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר את
400 Bad Request
.
- להמתין עד שהשגיאה
יש לוודא שהאפשרות Show allflowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
השגיאה תופיע בדרך כלל מיד אחרי השלב הבקשה התקבלה מהלקוח, כפי שמוצג כאן:
-
שימו לב לערכים של המאפיינים מהמעקב:
- שגיאה:
Decompression failure at request
- error.class:
com.apigee.rest.framework.BadRequestException
- error.cause:
Not in GZIP format
ב-error.cause מצוין שהמטען הייעודי (payload) של הבקשה אינו בפורמט GZIP. המשמעות היא ש-Apigee Edge ציפה שהמטען הייעודי (payload) של הבקשה יהיה בפורמט GZIP כפי שצוין בכותרת
Content-Encoding
. - שגיאה:
קביעת הערך של כותרת הבקשה
Content-Encoding
. כדי לעשות זאת, צריך לעבור לשלב הבקשה התקבלה מהלקוח, כפי שמוצג כאן:שימו לב שהערך של כותרת הבקשה
Content-Encoding
הוא אכןgzip
.לפי המעקב לדוגמה שלמעלה, ניתן לראות שהקידוד שצוין בכותרת הבקשה
Content-Encoding
הואgzip
. עם זאת, המטען הייעודי (payload) של הבקשה אינו בפורמט GZIP. לכן, Apigee לא יכולה לפרוס את המטען הייעודי (payload) באמצעות gzip ומחזירה את השגיאהDecompression failure at request
.- בודקים מהו קוד הסטטוס והודעת השגיאה שהוחזרה על ידי Apigee Edge.
לשלב תגובה שנשלחה ללקוח במעקב באופן הבא:
חשוב לשים לב לפרטים הבאים מהמעקב:
- קוד סטטוס:
400 Bad Request
. - תוכן השגיאה:
{"fault":{"faultstring":"Decompression failure at request","detail":{"errorcode":"messaging.adaptors.http.flow.DecompressionFailureAtRequest"}}}
- קוד סטטוס:
עוברים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
- גוללים למטה לקטע Phase Details, Error Headers וקובעים את הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
- הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source יופיעו כ-
messaging.adaptors.http.flow.DecompressionFailureAtRequest
וגםpolicy
. הערכים האלה מציינים שפורמט המטען הייעודי של הבקשה לא תואם לקידוד שצוין בכותרתContent-Encoding
.כותרות תגובה Value X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
NGINX
כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:
- אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של 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-code
כותרות תגובה Value X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequest
X-Apigee-fault-source policy
הסיבה: הפורמט של המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding
כברירת מחדל, Apigee Edge תמיד פורש את המטען הייעודי (payload) אם כותרת הבקשה Content-Encoding
מכילה קידוד חוקי ו
נתמך. לכן, צפוי שהפורמט של המטען הייעודי (payload) של הבקשה יהיה תואם לקידוד שצוין בכותרת הבקשה Content-Encoding
.
אם יש אי התאמה, תוצג לך השגיאה הזו.
אבחון
- מאתרים את קוד התקלה ואת מקור התקלה של השגיאה שנצפתה באמצעות מעקב API, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר במאמר שלבי האבחון הנפוצים.
- אם Fault Code הוא
messaging.adaptors.http.flow.DecompressionFailureAtRequest
ו-Fault Source יש את הערךpolicy
אוproxy
, המשמעות היא שהבקשה שנשלחה על ידי אפליקציית הלקוח מכילה מטען ייעודי (payload), שלא תואם ל הקידוד הנתמך שצוין בכותרת הבקשהContent-Encoding
. אפשר לראות את חוסר ההתאמה כחלק מבקשת ה-HTTP באמצעות אחת מהשיטות הבאות:
הודעת השגיאה
כדי לבצע אימות באמצעות הודעת השגיאה:
-
אם יש לך גישה להודעת השגיאה המלאה שהתקבלה מ-Apigee Edge, כדאי לעיין ב
faultstring
.הודעת שגיאה לדוגמה:
"faultstring":"Decompression failure at request"
- בהודעת השגיאה שלמעלה, הוא מציג את הערך
"Decompression failure at request"
, ומשתמע ממנו שלא ניתן היה לפענח את הבקשה באמצעות הקידוד שצוין בכותרתContent-Encoding
.
נתוני מעקב
כדי לבצע אימות באמצעות נתוני המעקב:
- קובעים את הערך של כותרת הבקשה Content-Encoding ושל המאפיין error.cause באמצעות Trace, כפי שמוסבר בדף שלבי האבחון הנפוצים.
הערכים מהמעקב לדוגמה הם:
- קידוד תוכן:
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
מופיע ברשימת הקידודים הנתמכים אבל הפורמט של המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרתContent-Encoding
, זו הסיבה לבעיה.בקשה לדוגמה:
curl -v "http://HOSTALIAS/v1/testgzip"
-H "Content-Encoding: gzip"
-X POST -d @request_payload.zipהבקשה לדוגמה שלמעלה שולחת את הערך
gzip
לכותרתContent-Encoding
, שהיא קידוד נתמך ב-Apigee Edge. עם זאת, המטען הייעודי (payload) של הבקשהrequest_payload.zip
הוא בפורמט ZIP. לכן, הבקשה הזו נכשלת עם קוד הסטטוס400 Bad Request
וקוד השגיאה:messaging.adaptors.http.flow.DecompressionFailureAtRequest
.
יומנים של מעבד ההודעות
לאימות באמצעות יומנים של מעבד ההודעות:
משתמשים בענן פרטי יכולים להיעזר ביומנים של מעבד ההודעות כדי לגלות את המידע החשוב לגבי שגיאות HTTP מסוג
400
.- אפשר לאתר את מזהה ההודעה של הבקשה שנכשלה באמצעות API Monitoring, הכלי למעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים הנפוצים לאבחון.
מחפשים את מזהה ההודעה ביומן של מעבד ההודעות:
/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() : Exception
java.util.zip.ZipException: Not in GZIP format
occurred 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
בהודעת השגיאה שלמעלה מציינת שמטען הייעודי (payload) של הבקשה לא נשלח בפורמט 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
בהודעת השגיאה שלמעלה מציינות שהמטען הייעודי (payload) של הבקשה לא נשלח בפורמט deflate ולא תואם לקידוד שצוין בכותרתContent-Encoding
של deflate. לכן, Apigee Edge מפעיל את החריג ומחזיר את קוד הסטטוס400
עם קוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequest
לאפליקציות הלקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של הבקשה הדחוסה בתהליך ה-API של שרת ה-proxy ב-Apigee Edge ובשרת הקצה העורפי, אין להעביר את הכותרת
Content-Encoding
. אם יש צורך לדחוס את המטען הייעודי (payload) של הבקשה, עוברים לשלב 2. - מוודאים שאפליקציית הלקוח תמיד שולחת את הפרטים הבאים:
- כל אחד מ
הקידודים הנתמכים בתור הערך של הכותרת
Content-Encoding
בבקשה - המטען הייעודי (payload) של הבקשה בפורמט הנתמך ל-Apigee Edge תואם לפורמט
הקידוד שצוין בכותרת
Content-Encoding
- כל אחד מ
הקידודים הנתמכים בתור הערך של הכותרת
- בדוגמה שלמעלה, המטען הייעודי (payload) של הבקשה הוא בפורמט ZIP אבל בכותרת הבקשה צוין
Content-Encoding: gzip
. כדי לפתור את הבעיה, אפשר לשלוח את כותרת הבקשה בתורContent-Encoding: gzip
והמטען הייעודי (payload) של הבקשה גם בפורמט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:
אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם שרת proxy ל-API
- צריך להשלים את הפקודה
curl
שמשמשת לשחזור השגיאה400
- קובץ מעקב לבקשות API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- זוהתה הודעת שגיאה מלאה בבקשות שנכשלו
- שם הסביבה
- חבילת שרת proxy ל-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