מה זה HTTP Status Codes ואיך לפענח את תגובות השרת

סער טויטו

סער טויטו

Software & Web Development


TL;DR
  • HTTP Status Codes קודים שהשרת מחזיר לכל בקשה — מאפשרים להבין האם הצליחה, נכשלה, או הועברה.
  • 2xx הצלחה, 3xx הפניה 200 OK, 201 Created, 204 No Content. 301 קבוע, 302/307 זמני.
  • 4xx שגיאת לקוח 400 נתונים שגויים, 401 לא מזוהה, 403 אין הרשאה, 404 לא נמצא, 429 יותר מדי בקשות.
  • 5xx שגיאת שרת 500 שגיאה פנימית, 502 Bad Gateway, 503 שרת לא זמין, 507 אין מקום אחסון.

הבנת HTTP Status Codes היא קריטית לכל מי שעוסק בפיתוח תוכנה בתחום פיתוח אתרים ואפליקציות ווב. קודים אלו מספקים מידע חשוב על תגובות השרת לבקשות ה-HTTP שאנחנו מבצעים. התגובות האלו, עוזרות לנו להבין האם הייתה בעיה בבקשה, האם הבקשה הצליחה, מידע רלוונטי שאנחנו צריכים לדעת ועוד הרבה! זו הדרך של השרת לדבר איתנו, ואנחנו צריכים להבין את השפה הזו Like a Pro!

HTTP Status Codes במבט כללי

HTTP Status Codes הם קודים מספריים שהשרת מחזיר לכל בקשה HTTP. הם מחולקים לחמש קבוצות: 1xx לתגובות מידע (נדירות), 2xx להצלחה (200 OK, 201 Created, 204 No Content), 3xx להפניות (301 קבוע, 302/307 זמני), 4xx לשגיאות לקוח (400 נתונים שגויים, 401 לא מזוהה, 403 אין הרשאה, 404 לא נמצא), ו-5xx לשגיאות שרת (500 שגיאה פנימית, 503 לא זמין). הכרתם חיונית לפיתוח API וטיפול בשגיאות.

Informational responses (100 – 199)

Informational responses לא נפוצות במיוחד בהשוואה ל-HTTP status codes אחרים שנכיר בקרוב. המטרה שלהן היא להודיע ללקוח כי הבקשה התקבלה, אך העיבוד שלה עדיין מתבצע. עם זאת, כפי שציינתי, השימוש בהן היום מועט. בואו נבחן כמה מהם:

  • 100 Continue - משמש לבדיקה אם השרת מוכן לקבל נתונים נוספים לפני שהלקוח שולח עוד מידע.

  • 101 Switching Protocols - מאפשר ללקוח לבקש מהשרת לעבור לפרוטוקול תקשורת אחר, לדוגמה מ-HTTP ל-WebSocket

אבל כמו שאמרתי, אין לכם מה לדאוג לגביהם כי דיי נדיר להשתמש בהם (אם בכלל).

Successful responses (200 – 299)

Successful responses מציינים שהבקשה שנשלחה עברה בהצלחה. כאשר אתם רואים קוד 2xx, זה אומר שהכל בסדר והבקשה עברה בהצלחה. הנה כמה successful responses נפוצים:

  • 200 OK - הבקשה הצליחה, כלומר מה שרצינו לבצע או להשיג, הצליח ואין שום בעיה.

  • 201 Created - הבקשה הצליחה, ונוצר משאב חדש כתוצאה מכך. לדוגמה הוספת פוסט חדש או יוזר חדש למערכת שלנו.

  • 204 No Content - הבקשה הצליחה, ואין לשרת צורך או סיבה לשלוח תוכן בחזרה לצד לקוח. לדוגמה אני רוצה להסיר מהרשימה שלי מוצר מסויים. אני לא חייב לקבל הודעה או תוכן מסויים מהשרת חוץ מה-status code 204 שהפעולה הצליחה ומשם השם No Content.

Redirection messages (300 – 399)

Redirection messages מציינות שהמידע שאנחנו רוצים לקבל, או לשלוח לשרת, הועבר למיקום אחר; כלומר ה-endpoint או פשוט ה-url הועברו לכתובת אחרת. לדוגמה, במקום כתובת www.codingwithsaar.co.il => זה יהיה www.codewithsaar.co.il. כלומר המשאב שאני מחפש (במקרה הזה זה כתובת האתר שלי) הועברה למקום אחר. דוגמאות ל-Redirection messages:

  • 301 Moved Permanently - המשאב הועבר לכתובת חדשה. זה אומר שהמשאב המבוקש כבר לא נמצא בכתובת המקורית והועבר לכתובת חדשה באופן קבוע.

  • 302 (Found) או 307 (Temporary Redirect) - מציין שההפניה היא זמנית, והלקוח צריך לבצע בקשה חדשה לכתובת הנתונה בתגובת השרת, אך לא נדרש לעדכן באופן מוחלט את ה-endpoint או את ה-url לאותו משאב, כי זה זמני.

Client error responses (400 – 499)

תגובות מסוג Client Error מציינות שהבקשה ששלח הלקוח מכילה מידע שגוי ולא ניתן לעבד אותה בהצלחה על ידי השרת. הן נפוצות במקרים של שגיאות קלט (הכנסת נתונים כמו אימייל, סיסמא וכדומה שהם לא נכונים), הרשאות, או נתיבים (endpoints) לא נכונים. דוגמאות ל-Client error responses:

  • 400 Bad Request - שגיאה זו מופיעה כאשר השרת לא מבין את הבקשה שלכם כי משהו לא בסדר במידע ששלחתם אליו. לדוגמה, אם אתם תנסו לשלוח טופס באתר אינטרנט אבל שכחתם למלא את כל השדות הנדרשים, ייתכן שתקבלו 400 Bad Request.

  • 401 Unauthorized - זה אומר שהמשתמש רצה לבצע פעולה מסויימת או לגשת למשאב מסויים אבל השרת דרש קודם כל לאמת את המשתמש, אבל המשתמש לא סיפק או לא הזדהה במערכת בדרך של login או כל הזדהות אחרת כמו טוקן (token). למי שלא מכיר, token הוא כמו תעודת זהות, שמשמשת לאימות זהות של המשתמש ולאפשר לו גישה למשאבים מוגנים. במילים פשוטות, המשתמש צריך להזדהות כדי לקבל גישה למשאב. אם אתם רוצים לקרוא עוד על אימות והרשאות באינטרנט, כנסו למאמר שלנו - אימות והרשאות באינטרנט בעזרת JWT.

  • 403 Forbidden - הבקשה נקלטת והמשתמש מזוהה, אבל המשתמש לא מורשה לגשת למשאב המבוקש. כלומר, השרת הבין את הבקשה אך מסרב לאשר אותה מסיבות שונות, כמו הרשאות לא מתאימות. עכשיו, בדרך כלל הרבה מתכנתים מתבלבלים בין 403 Forbidden לבין 401 Unauthorized, אז בואו נעשה סדר כדי להבין טוב יותר מה אומרת כל בעיה.

    ההבדל בין 401 ל-403

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

    לאחר שאתם מחוברים, פייסבוק מזהה אתכם כמשתמשים ואתם יכולים לפרסם פוסטים בקבוצה. אבל, אם תנסו למחוק תגובה של משתמש אחר בקבוצה, ואין לכם הרשאות מנהל, פייסבוק יחזיר שגיאת 403 Forbidden. השגיאה מציינת שאתם מזוהים אבל אין לכם הרשאה לבצע את הפעולה שרציתם.

  • 404 Not Found - השגיאה מתרחשת כאשר המשאב או הדף שהמשתמש מנסה לגשת אליו אינו קיים על השרת. כלומר זה כמו ללכת למסעדה ולבקש לקנות רכב. השרת מסוגל להבין את הבקשה שלכם, אבל המשאב המבוקש (קניית רכב) לא קיימת בשרת (במסעדה). בדרך כלל אתם תראו את זה כשאתם מנסים לבקר בדף באתר, אבל הדף הזה לא קיים.

  • 405 Method Not Allowed - השגיאה מתרחשת כאשר המשתמש, משתמש ב-HTTP Method (כמו GET, POST, PUT, DELETE וכו') שלא נתמכת עבור המשאב המבוקש בשרת. לדוגמה, אם יש לכם משאב (endpoint) שמקבל רק בקשות GET ואתם מנסים לשלוח בקשת POST אליו, השרת יחזיר שגיאת 405 שמציין שה-HTTP Method שנבחרה לא נתמכת עבור המשאב הזה.

  • 406 Not Acceptable - השגיאה מתרחשת כאשר השרת לא יכול לספק תגובה שמתאימה למה שהמשתמש רצה לקבל. לדוגמה, אם הלקוח מבקש תוכן בפורמט מסוים כמו PDF, אבל השרת יכול לתת את המידע הזה רק בפורמט JSON אז השרת יחזיר שגיאת 406.

  • 409 Conflict - השגיאה מתרחשת כאשר יש סתירה או חפיפה במשאב שהמשתמש מנסה ליצור או לעדכן, לדוגמה, כאשר שני משתמשים מנסים להתחבר לחשבון אחד בו זמנית, אחד מהם יקבל שגיאת 409, מציינת שיש קונפליקט בנתונים.

  • 410 Gone - השגיאה מתרחשת כאשר המשאב שהמשתמש מנסה לגשת אליו היה זמין בעבר אך כעת הוסר לצמיתות מהשרת. כלומר אם יש דף אינטרנט שהיה זמין בעבר אך נמחק לצמיתות, בקשה לכתובת ה-URL של הדף הזה תחזיר שגיאת 410 מהשרת.

  • 429 Too Many Requests - השגיאה מתרחשת כאשר המשתמש עשה יותר בקשות מהמותר על ידי השרת. לדוגמה, אם השרת מוגבל ל-100 בקשות לדקה והמשתמש שלח 150 בקשות בדקה, השרת יחזיר שגיאת 429 Too Many Requests.

Server error responses (500 – 599)

תגובות מסוג Server Error מציינות שהשרת נתקל בבעיה בעת ניסיון לעבד את הבקשה שהתקבלה מהלקוח. זה יכול להיות בעיה בקוד של השרת, בקונפיגורציה, במסד נתונים ועוד. דוגמאות ל-Server error responses:

  • 500 Internal Server Error - השגיאה מתרחשת כאשר השרת נתקל בבעיה פנימית, שמונעת אותו מלעבד את הבקשה שהתקבלה מהלקוח. זה יכול להיות בעיה בקוד של השרת, בקונפיגורציה, במסד נתונים ועוד.

  • 501 Not Implemented - שגיאה זו מופיעה כאשר השרת אינו מסוגל או לא תומך בפונקציונליות שהמשתמש ביקש. לדוגמה, אם המשתמש שולח בקשת HTTP עם HTTP Method שהשרת לא מכיר או לא יכול להתמודד איתה, אתם תקבלו בעיית 501. שימו לב שגם כאן יש לא מעט מתכנתים שמתבלבלים בין הבעיה 405 Method Not Allowed לבין 501 Not Implemented, אז בואו נבין מה ההבדל בינהם:

    ההבדל בין 501 לבין בעיה 405

    501 Not Implemented מתייחסת למצב שבו השרת לא תומך ב-HTTP Method שהועברה בבקשה. זה לא אומר שה-HTTP Method לא חוקית, אלא שברגע זה, השרת לא מסוגל להמודד איתה. לדוגמה, השרת עלול להיות חסר יכולת לטפל בבקשות PUT או DELETE בשל מגבלות טכניות או מדיניות פנימית.

    לעומת זאת, 405 Method Not Allowed מציינת שהשרת מזהה ומבין את ה-HTTP Method שנשלחה, אבל היא לא מורשית עבור המשאב המסוים שהלקוח ביקש. למשל, אם משאב כלשהו נגיש רק דרך בקשות GET ומישהו מנסה לשלוח בקשת POST, השרת יחזיר שגיאת 405.

    בקצרה, שגיאת 501 מעידה על חוסר יכולת של השרת לטפל ב-HTTP Method כלשהי, בעוד ששגיאת 405 מציינת שהשימוש ב-HTTP Method מסוימת אסור עבור משאב מסוים.

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

  • 503 Service Unavailable - השגיאה מתרחשת כאשר השרת לא יכול לעבד את הבקשה שהתקבלה מהלקוח כי השרת כרגע לא זמין. זה יכול להיות בגלל עומס גבוה על השרת, תחזוקה, תקלה ועוד.

  • 507 Insufficient Storage - שגיאה זו מתרחשת כאשר השרת לא מסוגל לאחסן את הנתונים שהמשתמש מנסה להעביר בגלל חוסר במקום אחסון פנוי. לדוגמה, אם משתמש מנסה להעלות סרטון גדול מדי לאתר, ואין מספיק מקום פנוי בשרת של האתר, השרת יחזיר שגיאת 507, מציינת שאין מספיק מקום זמין לאחסון הסרטון.

סיכום

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

שאלות נפוצות על HTTP Status Codes

מה זה HTTP Status Codes ולמה חשוב להכיר אותם?

HTTP Status Codes הם קודים מספריים שהשרת מחזיר לכל בקשה HTTP שנשלחת אליו. הם מחולקים לחמש קבוצות: 1xx מידע, 2xx הצלחה, 3xx הפניה, 4xx שגיאת לקוח, 5xx שגיאת שרת. הכרתם חיונית לפיתוח API, לאבחון בעיות ולבניית לוגיקת טיפול בשגיאות נכונה.

מה ההבדל בין שגיאת 401 Unauthorized לשגיאת 403 Forbidden?

401 Unauthorized משמעותו שהמשתמש לא זוהה בכלל — לא ביצע login, אין טוקן תקין. 403 Forbidden משמעותו שהמשתמש זוהה בהצלחה אך אין לו הרשאות לבצע את הפעולה. דוגמה: ב-401 תנסו לגשת לפרופיל שלכם בפייסבוק בלי להתחבר. ב-403 תנסו למחוק תגובה של מישהו אחר בלי שאתם מנהל קבוצה.

מה ההבדל בין 404 Not Found ל-410 Gone?

404 Not Found אומר שהמשאב לא נמצא — אך ייתכן שהוא קיים בכתובת אחרת או שה-URL שגוי. 410 Gone אומר שהמשאב היה קיים בעבר אך הוסר לצמיתות. ל-SEO, 410 עדיף על 404 כשמורידים תוכן, כי הוא מורה לגוגל להסיר את הדף מהאינדקס מיד.

מה המשמעות של שגיאת 500 Internal Server Error?

500 Internal Server Error מתרחשת כאשר השרת נתקל בבעיה פנימית שמונעת עיבוד הבקשה. הסיבות הנפוצות: באג בקוד השרת, בעיה במסד הנתונים, קריסת שירות או קונפיגורציה שגויה. בניגוד לשגיאות 4xx שהן אחריות הלקוח, 5xx הן אחריות השרת.

מה ההבדל בין 501 Not Implemented ל-405 Method Not Allowed?

501 Not Implemented אומר שהשרת לא תומך ב-HTTP Method שנשלחה בכלל — מגבלה כללית של השרת. 405 Method Not Allowed אומר שהשרת מבין ותומך ב-HTTP Method, אך היא לא מותרת עבור המשאב הספציפי הזה. לדוגמה, endpoint שמקבל GET בלבד יחזיר 405 אם תשלחו אליו POST.