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, שכוללת סימן אחוז ואחריו שתי ספרות הקסדצימליות שמייצגות את קוד ה-ASCII של התו הספציפי.
    • לכן, גם אם סימן האחוז (%) מותר בנתוני הטופס, הוא מפורש כהתחלה של רצף בריחה מיוחד. לכן, אם נתוני הטופס צריכים להכיל את סימן האחוז (%) במפתח או בערך, צריך להעביר אותם כ-%25, , שמייצג את קוד ה-ASCII של התו של סימן האחוז (%).
  2. Content-Type: multipart/form-data

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

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

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

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

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

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

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

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

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

API Monitoring

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

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

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

  6. בוחרים תא עם קוד השגיאה protocol.http.BadFormData כמו בדוגמה הבאה:

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

  7. המידע על קוד התקלה protocol.http.BadFormData מוצג כמו בדוגמה הבאה:

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

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

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

כלי המעקב

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

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

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

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

  6. עוברים אל הרכיב של הזרימה שנקרא Error אחרי המדיניות הספציפית שנכשלה:

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

    שגיאה: Bad Form Data

    state: PROXY_REQ_FLOW

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

    • הערך של השגיאה Bad Form Data מציין שבפרמטרים של הטופס היו תווים שאסור להשתמש בהם.
    • הערך של המצב PROXY_REQ_FLOW, מציין שהשגיאה התרחשה בתהליך הבקשה של proxy ל-API.
  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 קראה או חילצה את נתוני הטופס (פרמטרים של הטופס), שכללו תווים שאסור להשתמש בהם.

    כותרות תגובה ערך
    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, , כלומר המדיניות ExtractVariables שנקראת EV-ExtractFormParams נכשלה במהלך קריאה או חילוץ של פרמטרים של הטופס.

NGINX

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

  1. אם אתם משתמשי Private Cloud, אתם יכולים להשתמש ביומני הגישה של 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 הם:

    כותרות ערך
    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 קראה או חילצה את נתוני הטופס (פרמטרים של הטופס), שהכילו תווים שאסור להשתמש בהם.
  6. בדוגמה הזו, הערך של X-Apigee-fault-policy הוא extractvariables/EV- ExtractFormParams, , כלומר המדיניות ExtractVariables בשם EV-ExtractFormParams נכשלה במהלך קריאת פרמטרים של טופס.

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

אבחון

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

      דוגמה 1

      דוגמה 1: מדיניות ExtractVariables שמוציאה פרמטרים מטופס:

            <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>
            

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

      • מקור: request

        הסימן לכך הוא הרכיב <Source>

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

        האלמנט <Pattern> בתוך האלמנט <FormParam> מציין את זה.

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

      דוגמה מס' 2

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

            <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>
            

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

      • מקור: 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

        דוגמה לבקשה מספר 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 על ידי הלקוח מקודדים תמיד כמו שמוסבר במאמר נתוני טופס – application/x-www-form-urlencoded.
  2. בדוגמאות שצוינו למעלה, אפשר לפתור את הבעיות באופן הבא:

    דוגמה 1

    דוגמה 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

    דוגמה לבקשה מספר 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:

אם אתם משתמשי ענן ציבורי, עליכם לספק את הפרטים הבאים:

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

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

  • הודעת השגיאה המלאה שזוהתה בבקשות שנכשלו
  • שם הסביבה
  • חבילת 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

קובצי עזר