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, כמו שמוסבר טפסים – סעיף 17.13.4.2

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

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

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

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

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

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

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

יש להשתמש באחד מהכלים או השיטות הבאים כדי לאבחן את השגיאה:

מעקב API

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

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

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

  6. צריך לבחור תא עם קוד התקלה protocol.http.BadFormData בתור למטה:

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

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

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

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

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

כלי המעקב

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

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

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

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

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

  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. גוללים למטה לקטע פרטי שלב - כותרות שגיאה ו קובעים את הערכים של 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. אם אתם משתמשים בענן פרטי, תוכלו להשתמש ביומני הגישה ל-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. מגדירים את Fault Code, Fault Source ומדיניות Fault של 500 Internal Server Error באמצעות API Monitoring, כלי מעקב או יומני גישה ל-NGINX, כפי שמוסבר בשלבי האבחון הנפוצים.
  2. אם קוד השגיאה הוא protocol.http.BadFormData, המאפיין Fault Source כולל הערך proxy או 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

      דוגמה שנייה: הקצאה של פרמטרים של טופס להעתקת מדיניות של 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. עוברים לשלב Requested from Client (בקשה שהתקבלה מהלקוח).
      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

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

    צריך להשתמש ב-תקינים תווים הקסדצימליים שתואמים לקוד 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:

אם אתם משתמשים ב-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

קובצי עזר