500 שגיאת שרת פנימית - BadFormData

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

תיאור הבעיה

אפליקציית הלקוח מקבלת קוד סטטוס HTTP של 500 Internal Server Error עם קוד השגיאה protocol.http.BadFormData כתגובה לקריאות ל-API.

הודעת השגיאה

אפליקציית הלקוח מקבלת את קוד התגובה הבא:

HTTP/1.1 500 Internal Server Error

בנוסף, עשויה להופיע הודעת השגיאה הבאה:

{
   "fault":{
      "faultstring":"Bad Form Data",
      "detail":{
         "errorcode":"protocol.http.BadFormData"
      }
   }
}

נתוני טופס

לפני שניכנס לפרטים של פתרון בעיות, כדאי להבין מהם נתוני טפסים.

נתוני טופס הם המידע שהמשתמש מספק, בדרך כלל, באמצעות טופס HTML שמכיל רכיבים כמו תיבת קלט של טקסט, לחצן או תיבת סימון. בדרך כלל, נתוני הטופס נשלחים כסדרה של צמדי מפתח/ערך כחלק מבקשות או מתגובות HTTP.

העברת נתוני טפסים

  1. Content-Type: application/x-www-form-urlencoded
    • אם גודל נתוני הטופס קטן, הנתונים נשלחים כצמדי מפתח/ערך עם:
      • התווים בשני המפתחות מקודדים בהתאם לכללים שמוסברים טפסים – סעיף 17.13.4.1
      • הכותרת Content-Type: application/x-www-form-urlencoded

      בקשה לדוגמה עם נתוני טופס:

      curl https://HOSTALIAS/somepath -H "Content-Type: application/x-www-form-urlencoded" -d "username=abc@google.com&pasword=secret123"
      
    • תווים מקודדים שאינם אלפא-נומריים גם במפתחות וגם בערכים%HH
    • לכן, למרות שסימן האחוז (%) מותר בנתוני הטופס, הוא מפורש כהתחלה של רצף בריחה מיוחד. לכן, אם נתוני הטופס צריכים לכלול את סימן האחוז (%) במפתח או בערך, יש להעביר אותם בפורמט %25, שמייצג את קוד ה-ASCII של תו סימן האחוז (%).
  2. Content-Type: multi-part/form-data

    אם אתם רוצים להעביר כמויות גדולות של נתונים בינאריים או טקסט שמכיל תווים שאינם ASCII, אפשר לשלוח את הנתונים עם Content-Type: multipart/form-data כפי שמוסבר טפסים – סעיף 17.13.4.2

גורמים אפשריים

שגיאה זו מתרחשת אך ורק אם כל התנאים הבאים מתקיימים:

  1. בקשת ה-HTTP שנשלחה על ידי הלקוח ל-Apigee Edge מכילה:
    1. Content-Type: application/x-www-form-urlencoded, וגם
    2. נתוני טופס עם סימן האחוז (%) או סימן האחוז (%) ואחריו תווים הקסדצימליים לא חוקיים, שאינם מותרים לפי Forms – סעיף 17.13.4.1.
  2. שרת ה-API של ממשק ה-API ב-Apigee Edge קורא את הפרמטרים הספציפיים של הטופס שמכילים תווים שאסור להשתמש בהם בתהליך הבקשה, באמצעות extracts או המדיניות assignMessage.

    לדוגמה, אם נתוני הטופס מכילים את סימן האחוז (%) כפי שהוא (ללא קידוד) או את סימן האחוז (%) ולאחריו תווים הקסדצימליים לא חוקיים במפתח ו/או בערך, השגיאה הזו תופיע.

    אלה הסיבות האפשריות לשגיאה הזו:

    סיבה תיאור ההוראות לפתרון בעיות הרלוונטיות עבור
    בפרמטרים של הטופס בבקשה יש תווים שאסור להשתמש בהם הפרמטרים של הטופס שמועברים כחלק מבקשת ה-HTTP על ידי הלקוח מכילים תווים שאסור להשתמש בהם. משתמשי Edge הציבוריים והפרטיים

שלבים נפוצים באבחון

אפשר להשתמש באחד מהכלים/הטכניקות הבאים כדי לאבחן את השגיאה הזו:

מעקב באמצעות API

כדי לאבחן את השגיאה באמצעות API Monitoring:

  1. נכנסים לממשק המשתמש של Apigee Edge בתור משתמשים עם תפקיד מתאים.
  2. עוברים לארגון שבו רוצים לבדוק את הבעיה.

  3. עוברים לדף ניתוח > API Monitoring > חקירה.
  4. בוחרים את מסגרת הזמן הספציפית שבה הבחנתם בשגיאות.
  5. יש להציב את קוד השגיאה ביחס ל-Time.

  6. צריך לבחור תא שמכיל את קוד השגיאה protocol.http.BadFormData כפי שמוצג כאן:

    (הצג תמונה גדולה יותר)

  7. מידע על קוד התקלה protocol.http.BadFormData מוצג באופן שמוצג למטה:

    (הצג תמונה גדולה יותר)

  8. לוחצים על View Logs (הצגת היומנים) ומרחיבים את השורה של הבקשה שנכשלה.

  9. בחלון Logs, שימו לב לפרטים הבאים:
    • קוד סטטוס: 500
    • מקור התקלה: proxy
    • קוד שגיאה: protocol.http.BadFormData
    • מדיניות תקלות: extractvariables/EV-ExtractFormParams
  10. אם Fault Source הוא proxy, Fault Code לא יכולה להיות ריקה, זה אומר שהשגיאה אירעה בזמן שהמדיניות הספציפית שצוינה ב-Fault Policy הייתה קריאה או חילוץ של נתוני הטופס (פרמטרים של הטופס), שכוללים תווים שאסור להשתמש בהם.protocol.http.BadFormData
  11. בדוגמה הזו, הערך של X-Apigee-fault-policy הוא extractvariables/EV- ExtractFormParams, , והמשמעות היא שהמדיניות extracts שנקראת EV-extractFormParams נכשלה במהלך הקריאה או החילוץ של הפרמטרים של הטופס.

כלי המעקב

כדי לאבחן את השגיאה באמצעות כלי המעקב:

  1. מפעילים את הפעלת המעקב וגם:
    • להמתין עד שהשגיאה 500 Internal Server Error תתרחש, או
    • אם הצלחת לשחזר את הבעיה, יש לבצע את הקריאה ל-API כדי לשחזר את הבעיה 500 Internal Server Error
  2. יש לוודא שהאפשרות Show allflowInfos מופעלת:

  3. בוחרים אחת מהבקשות שנכשלו ובודקים את המעקב.
  4. אפשר לנווט בין השלבים השונים של המעקב ולאתר את המיקום שבו אירעה הכשל.
  5. השגיאה מופיעה בדרך כלל באחד מכללי המדיניות באופן הבא:

    במעקב לדוגמה שלמעלה, יש לשים לב שהכשל אירע במדיניות חילוץ משתנים בשם EV-ExtractFormParams.

  6. מנווטים לתהליך שנקרא שגיאה אחרי המדיניות הספציפית שנכשלה:

  7. שימו לב לערכים הבאים מהמעקב:

    שגיאה: Bad Form Data

    מדינה: PROXY_REQ_FLOW

    error.class: com.apigee.rest.framework.BadRequestException

    • הערך של השגיאה Bad Form Data מציין שבפרמטרים של הטופס היו כמה תווים שאסור להשתמש בהם.
    • הערך של המצב PROXY_REQ_FLOW, מציין שהשגיאה אירעה בתהליך הבקשה של שרת ה-API של שרת ה-proxy.
  8. מנווטים לשלב AX (רישום נתונים ב-Analytics) במעקב ולוחצים עליו.
  9. גוללים למטה לקטע Phase Details - Error Headers (כותרות שגיאה) ומוצאים את הערכים של X-Apigee-fault-code, X-Apigee-fault-source, ו-X-Apigee-fault-policy.

  10. חשוב לשים לב שהערכים של X-Apigee-fault-code ושל X-Apigee-fault-source הם protocol.http.BadFormData ו-policy בהתאמה, והערך של X-Apigee-fault-policy לא יכול להיות ריק. פירוש הדבר הוא שהשגיאה אירעה בזמן שהמדיניות הספציפית שצוינה ב-X-Apigee-fault-policy קראה או חלצה את נתוני הטופס (פרמטרים של הטופס), שכוללים תווים שאסור להשתמש בהם.

    כותרות תגובה Value
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  11. בדוגמה הזו, X-Apigee-fault-policy הוא extractvariables/EV- ExtractFormParams, , והמשמעות היא שהמדיניות extracts בשם EV-ExtractFormParams נכשלה במהלך הקריאה או החילוץ של הפרמטרים של הטופס.

NGINX

כדי לאבחן את השגיאה באמצעות יומני הגישה של NGINX:

  1. אם אתם משתמשים בענן פרטי, אתם יכולים להשתמש ביומני הגישה של NGINX כדי לזהות את המידע העיקרי על HTTP 500 Internal Server Error.
  2. כדאי לבדוק את יומני הגישה של NGINX:

    /opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log

  3. אפשר לחפש כדי לראות אם יש שגיאות 500 עם קוד השגיאה protocol.http.BadFormData במהלך משך זמן ספציפי (אם הבעיה אירעה בעבר) או אם יש בקשות שעדיין נכשלות עם 500.
  4. אם יש שגיאות 500 ב-X-Apigee-fault-code שתואם לערך של protocol.http.BadFormData, צריך לקבוע את הערך של X-Apigee-fault-source ושל X-Apigee-fault-policy.

    שגיאה 500 לדוגמה ביומן הגישה של NGINX:

    הרשומה לדוגמה שלמעלה מיומן הגישה של NGINX כוללת את הערכים הבאים עבור X-Apigee-fault-code ו-X-Apigee-fault-source:

    כותרות Value
    X-Apigee-fault-code protocol.http.BadFormData
    X-Apigee-fault-source policy
    X-Apigee-fault-policy extractvariables/EV-ExtractFormParams
  5. הערה: הערכים של X-Apigee-fault-code, של X-Apigee-fault-source הם protocol.http.BadFormData, policy בהתאמה, ו-X-Apigee-fault-policy לא יכולה להיות ריקה. השגיאה מציינת שהשגיאה אירעה בזמן שהמדיניות הספציפית שצוינה ב-X-Apigee-fault-policy, קראה או חלצת את נתוני הטופס (פרמטרים של הטופס), שכוללים תווים שX-Apigee-fault-policy, להשתמש בהם.
  6. בדוגמה הזו, הערך של X-Apigee-fault-policy הוא extractvariables/EV- ExtractFormParams, , והמשמעות היא שהמדיניות ex-Variables שנקראת EV-ExtractFormParams נכשלה בזמן קריאת הפרמטרים של הטופס.

הסיבה: בפרמטרים של הטופס בבקשה יש תווים שאסור להשתמש בהם

אבחון

  1. קובעים את קוד התקלה, מקור התקלה ומדיניות התקלה עבור 500 Internal Server Error באמצעות מעקב API, כלי המעקב או יומני גישה של NGINX, כמו שמוסבר בשלבים נפוצים לאבחון.
  2. אם Fault Code (קוד תקלה) הוא protocol.http.BadFormData, FaultSource מכילים את הערך proxy או policy, ו-Fault Policy לא ריקה, זה אומר שהמדיניות שצוינה ב-Fault Policy נכשלה במהלך הקריאה או החילוץ של נתוני הטופס (פרמטרים של טופס).
  3. בודקים את המדיניות שצוינה במדיניות השגיאה וקובעים את הפרטים הבאים:
    1. Source: יש לקבוע אם המדיניות קוראת או מחלצת את הנתונים מהבקשה או מהתגובה.
    2. פרמטרים של טופס: קובעים את הפרמטרים הספציפיים של הטופס שנקראים במדיניות.

      דוגמה מס' 1

      דוגמה 1: המדיניות extracts לחילוץ פרמטרים של טופס:

            <ExtractVariables name="EV-ExtractFormParms">
               <DisplayName>EV-ExtractFormParams</DisplayName>
               <Source>request</Source>
               <FormParam name="username">
                  <Pattern ignoreCase="false">{username}</Pattern>
               </FormParam>
               <FormParam name="password">
                 <Pattern ignoreCase="false">{password}</Pattern>
               </FormParam>
               <VariablePrefix>forminfo</VariablePrefix>
             <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
            </ExtractVariables>
            

      במדיניות extracts שלמעלה:

      • מקור: request

        דבר זה מצוין על ידי הרכיב <Source>

      • פרמטרים של הטופס: username ו-password

        דבר זה מצוין על ידי הרכיב <Pattern> שבתוך הרכיב <FormParam>

      המשמעות היא שהפרמטרים בטופס username ו/או password שהועברו כחלק מבקשת ה-HTTP על ידי הלקוח אל Apigee Edge מכילים תווים שאסור להשתמש בהם.

      דוגמה מס' 2

      דוגמה 2: מדיניות הקצאה של העתקת פרמטרים של טופס:

            <AssignMessage continueOnError="false" enabled="true" name="AM-CopyFormParams">
              <Copy source="request">
                <FormParams>
                  <FormParam name="username"/>
                  <FormParam name="password"/>
                </FormParams>
              </Copy>
              <AssignTo createNew="true" transport="http" type="request"/>
            </AssignMessage>
            

      במדיניות extracts שלמעלה:

      • מקור: request

        ניתן לראות זאת באמצעות המאפיין source ברכיב <Copy>

      • פרמטרים של הטופס: username ו-password

        ניתן לראות זאת באמצעות המאפיין name ברכיב <FormParam>

      המשמעות היא שהפרמטרים בטופס username או password או שניהם, שהועברו כחלק מבקשת ה-HTTP על ידי הלקוח אל Apigee Edge, מכילים תווים שאסור להשתמש בהם.

  4. בפרמטרים של הטופס שציינתם בשלב 3 תוכלו לבדוק אם יש תווים שאסור להשתמש בהם באמצעות אחת מהשיטות הבאות:

    כלי המעקב

    כדי לבצע אימות באמצעות כלי המעקב:

    1. אם תיעדתם את נתוני המעקב של הבקשה שנכשלה כפי שמוסבר בקטע שלבי האבחון הנפוצים, בחרו אחת מהבקשות שנכשלו.
    2. אם זיהיתם שהפרמטרים של הטופס שמכילים תווים שאסור להשתמש בהם הם חלק מבקשת ה-HTTP בשלב 3 שלמעלה, אז
      1. עוברים לשלב בקשה שהתקבלה מהלקוח.
      2. גוללים למטה לקטע פרטי השלב ובודקים את הקטע בקשת תוכן.

        ( הצגת תמונה גדולה יותר)

      3. בדוגמה שלמעלה, שימו לב שפרמטר הטופס password מכיל את סימן האחוז (%).
      4. מכיוון שסימן האחוז (%) משמש גם ל קידוד האחוז של התווים המיוחדים, לא ניתן להשתמש בו כפי שהוא בנתוני הטופס.
      5. לכן, Apigee Edge מגיבה עם 500 Internal Server Error עם קוד השגיאה protocol.http.BadFormData.

    בקשה בפועל

    כדי לאמת באמצעות הבקשה עצמה:

    1. אם אין לכם גישה לבקשה שנשלחה בפועל לשרת היעד, עוברים לפתרון.
    2. אם יש לכם גישה לבקשה שנשלחה בפועל ל-Apigee Edge, תוכלו לבצע את השלבים הבאים:
      1. בודקים את התוכן של נתוני הטופס כדי לראות אם הוא מכיל תווים שאסור להשתמש בהם, כמו סימן האחוז (%) או סימן האחוז (%) ואחריהם תווים הקסדצימליים לא חוקיים.

        דוגמה מס' 1

        בקשה מס' 1 לדוגמה: נתוני טופס כחלק מהבקשה

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%ZY"
        

        בדוגמה הזו, חשוב לשים לב שהרכיב client_secret מכיל את סימן האחוז (%) ואחריו תווים הקסדצימליים לא חוקיים ZY.

        דוגמה מס' 2

        בקשה שנייה לדוגמה: נתוני טופס שמועברים בקובץ:

        curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
        

        התוכן של form_data.xml:

        xml=<user><username>abc1234@google.com</username><password>qwerty12345!@#$%</password></user>
        

        בדוגמה הזו, חשוב לשים לב שהרכיב password מכיל את סימן האחוז (%), שאין להעביר אותו כפי שהוא בנתוני הטופס.

    3. בשתי הדוגמאות שלמעלה, נתוני הטופס שנשלחים כחלק מבקשת HTTP אל Apigee Edge מכילים תווים שאסור להשתמש בהם.
    4. לכן, Apigee Edge מגיבה עם 500 Internal Server Error עם קוד השגיאה protocol.http.BadFormData.

רזולוציה

  1. חשוב לוודא שכל התווים המיוחדים גם במפתחות וגם בערכים של נתוני הטופס או הפרמטרים שנשלחים כחלק מבקשת ה-HTTP שהלקוח מקודד תמיד מקודדים כפי שמוסבר בקטע Form Data - application/x-www-form-urlencoded
  2. בדוגמאות שצוינו למעלה, תוכלו לתקן את הבעיות באופן הבא:

    דוגמה מס' 1

    דוגמה ראשונה: נתוני הטופס שהועברו כחלק מהבקשה:

    צריך להשתמש ב תווים הקסדצימליים חוקיים שתואמים לקוד ה-ASCII של תו ספציפי. לדוגמה, אם רוצים לשלוח את סימן הדולר ($), צריך להשתמש בפונקציה %24 כפי שמוצג כאן:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d "client_id=123456abc123&client_secret=c23578%24"
    

    דוגמה מס' 2

    בקשה שנייה לדוגמה: נתוני טופס שמועברים בקובץ:

    curl -X GET "https://HOSTALIAS/myproxy -H "Content-Type: application/x-www-form-urlencoded" -d @form_data.xml
    

    התוכן של form_data.xml:

    צריך להשתמש בקידוד באחוזים עבור סימן האחוז (%), שמשנה את הקובץ כך שיכלול %25 כפי שמוצג בהמשך:

    xml=<user><username>abc1234@google.com</username><password>qwerty12345!!@#$%25</password></user>
    

מפרט

ב-Apigee Edge מצפה שנתוני הטופס יישלחו בהתאם למפרטים הבאים:

מפרט
נתוני טופס – application/x-www-form-urlencoded

אם אתם עדיין זקוקים לעזרה מהתמיכה של Apigee, תוכלו לקרוא את המאמר חובה לאסוף פרטי אבחון.

צריך לאסוף פרטי אבחון

אם הבעיה נמשכת גם אחרי שביצעתם את ההוראות שלמעלה, עליכם לאסוף את פרטי האבחון הבאים ולאחר מכן לפנות לתמיכה של Apigee Edge:

אם אתם משתמשים ב-Public Cloud, עליכם לספק את הפרטים הבאים:

  • שם הארגון
  • שם הסביבה
  • שם שרת proxy ל-API
  • משלימים את פקודת curl שמשמשת לשחזור 500 Internal Server Error עם קוד השגיאה protocol.http.BadFormData
  • קובץ מעקב לבקשות 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

קובצי עזר