מוצג המסמך של 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, - פורמט המטען הייעודי (Payload) שהלקוח שולח כחלק מבקשת ה-HTTP לא
להתאים לפורמט הקידוד שצוין בכותרת
Content-Encoding
אבל
הסיבה לכך היא ש-Apigee Edge לא מצליחה לפענח את המטען הייעודי (payload) באמצעות הקידוד שצוין,
של המטען הייעודי (Payload) אינו בפורמט זהה לזה של הקידוד שצוין
הכותרת Content-Encoding.
הנה כמה דוגמאות לערכים נתמכים של Content-Encoding ולאופן השימוש ב-Apigee Edge
מצפה שפורמט המטען הייעודי (Payload) יהיה במקרים האלה:
| תרחיש | קידוד התוכן | הפורמט הצפוי של המטען הייעודי (Payload) |
|---|---|---|
| קידוד יחיד | gzip | פורמט צפייה פורמט RFC1952 GZIP. |
| קידוד יחיד | להקטין | בפורמט הזה נעשה שימוש במבנה |
| קידוד מרובה | קידוד מרובה לדוגמה, במקרים שבהם הקידוד מתבצע פעמיים, המצב עשוי להיות:
|
קידודים מרובים הופעלו במטען הייעודי (payload) בסדר הנתון כפי שהוא מופיע בכותרת. |
הסיבות האפשריות לשגיאה הזו הן:
| סיבה | תיאור | הוראות לפתרון בעיות עבור |
|---|---|---|
| פורמט המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding | הפורמט של המטען הייעודי (payload) של הבקשה שנשלח על ידי הלקוח אינו מקודד או לא
תואם לקידוד שצוין בכותרת Content-Encoding. |
משתמשי Edge בענן הציבורי והפרטי |
שלבי אבחון נפוצים
יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:
מעקב API
כדי לאבחן את השגיאה באמצעות API Monitoring:
- נכנסים ל-Apigee Edge UI כמשתמש עם התפקיד המתאים.
עוברים לארגון שבו רוצים לחקור את הבעיה.
- מנווטים אל ניתוח > מעקב API > לחקור את הדף.
- בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
- מוודאים שהמסנן של שרת ה-proxy מוגדר לאפשרות All.
- הציגו את קוד התקלה ביחס ל-Time.
צריך לבחור תא עם קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtRequestבתור מוצגת למטה:
מידע על קוד התקלה
messaging.adaptors.http.flow.DecompressionFailureAtRequestמוצג כפי שמוצג כאן:
לוחצים על הצגת היומנים ומרחיבים את השורה שבה מופיעה השגיאה
400.
- בחלון יומנים שימו לב לפרטים הבאים:
- קוד סטטוס:
400 - מקור התקלה:
proxy - קוד התקלה:
messaging.adaptors.http.flow.DecompressionFailureAtRequest.
- קוד סטטוס:
- אם ל-Fault Source יש את הערך
proxy, זה מציין שפורמט המטען הייעודי (payload) של הבקשה לא התאים בקידוד נתמך שמצוין בכותרתContent-Encoding.
כלי המעקב
כדי לאבחן את השגיאה באמצעות כלי המעקב:
- מפעילים את סשן המעקב
וגם:
- צריך להמתין עד שהשגיאה
400 Bad Requestתתרחש, או - אם הצלחתם לשחזר את הבעיה, יש לבצע את הקריאה ל-API ולשחזר
400 Bad Request
- צריך להמתין עד שהשגיאה
מוודאים שהאפשרות Show all FlowInfos מופעלת:
- בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
- לעבור בין השלבים השונים במעקב ולאתר את מקום התקלה אירעה שגיאה.
בדרך כלל השגיאה תופיע בתהליך מיד אחרי שלב הבקשה התקבלה מהלקוח כפי שמוצג בהמשך:
-
שימו לב לערכי המאפיינים שמופיעים במעקב:
- שגיאה:
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. לשם כך, עוברים לשלב Requestd from Client (בקשה שהתקבלה מהלקוח) כפי שמוצג כאן:
שימו לב שהערך של כותרת הבקשה
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 Data Recorded) במעקב ולוחצים עליה.
- גוללים למטה לקטע פרטי שלב, כותרות של שגיאות ו
לקבוע את הערכים של X-Apigee-fault-code ושל X-Apigee-fault-source
כפי שמוצג בהמשך:
- יופיעו הערכים של X-Apigee-fault-code ו-X-Apigee-fault-source.
בתור
messaging.adaptors.http.flow.DecompressionFailureAtRequestוpolicy, שמציין שפורמט המטען הייעודי (payload) של הבקשה לא תאם הקידוד שמצוין בכותרתContent-Encoding.כותרות של תשובות ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-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-source:
כותרות של תשובות ערך X-Apigee-fault-code messaging.adaptors.http.flow.DecompressionFailureAtRequestX-Apigee-fault-source policy
הסיבה: פורמט המטען הייעודי (payload) של הבקשה לא תואם לקידוד שצוין בכותרת Content-Encoding
כברירת מחדל, ב-Apigee Edge תמיד מבטל את הדחיסה של המטען הייעודי (payload) אם כותרת הבקשה
Content-Encoding מכיל ערך תקין של
בקידוד נתמך. לכן, צפוי שהפורמט של המטען הייעודי (Payload) של הבקשה יהיה
חייב להיות תואם לקידוד שצוין בכותרת הבקשה Content-Encoding.
אם יש חוסר התאמה, מקבלים את השגיאה הזו.
אבחון
- מגדירים את קוד השגיאה ואת מקור התקלה של השגיאה שזוהתה באמצעות ה-API יומני Monitoring, כלי מעקב או יומני גישה ל-NGINX, כמו שמוסבר ב שלבי האבחון הנפוצים.
- אם קוד השגיאה הוא
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.
Trace
כדי לאמת באמצעות נתוני המעקב:
- קובעים את הערך של כותרת הבקשה Content-Encoding הנכס error.cause באמצעות Trace כפי שמוסבר בשלבי האבחון הנפוצים.
הערכים מהמעקב לדוגמה הם:
- קידוד תוכן:
gzip - error.cause:
Not in GZIP format
הערך בכותרת הבקשה Content-Encoding הוא gzip; עם זאת, המטען הייעודי (payload) של הבקשה הוא לא בפורמט GZIP. (כפי שמצוין על ידי error.cause). לכן, Apigee Edge מגיבה
400 Bad Requestוקוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequest.- קידוד תוכן:
הבקשה בפועל
כדי לאמת באמצעות הבקשה עצמה:
אם יש לכם גישה לבקשה שנשלחה בפועל על ידי הלקוח מבצעים את השלבים הבאים:
- קובעים את הערך שמועבר לכותרת הבקשה
Content-Encoding. - קובעים את הפורמט של המטען הייעודי (Payload) שנשלח כחלק מהבקשה.
אם הערך של הכותרת
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.
יומני מעבד ההודעות
כדי לאמת באמצעות יומני מעבד הודעות:
אם אתם משתמשים ב-Private Cloud, תוכלו להשתמש ביומני עיבוד ההודעות. כדי לקבוע את המידע העיקרי לגבי שגיאות 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() : 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בהודעת השגיאה שלמעלה מציינים שהמטען הייעודי (Payload) של הבקשה לא נשלח. הוא לא תואם לקידוד שצוין הכותרתContent-Encodingשל deflate. לכן, Apigee Edge זורקת את החריג ומחזירה קוד סטטוס400עם קוד השגיאהmessaging.adaptors.http.flow.DecompressionFailureAtRequestלאפליקציות לקוח.
-
רזולוציה
- אם אין צורך במטען הייעודי (payload) של הבקשה הדחוסה בתהליך ה-Proxy ל-API ב-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, עליכם לספק את הפרטים הבאים:
- שם הארגון
- שם הסביבה
- שם ה-API של ה-Proxy
- צריך להשלים את הפקודה
curlששימשה לשחזור השגיאה400 - קובץ מעקב אחר בקשות ה-API
אם אתם משתמשים בענן פרטי, עליכם לספק את הפרטים הבאים:
- הודעת שגיאה מלאה שנצפתה בבקשות שנכשלו
- שם הסביבה
- חבילת API Proxy
- קובץ מעקב אחר בקשות ה-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