דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. בנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים

בנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים

מתוזמן נעוץ נעול הועבר תכנות
15 פוסטים 5 כותבים 504 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מחובר
    yossizY מחובר
    yossiz
    כתב ב נערך לאחרונה על ידי yossiz
    #1

    יש אפליקציה (וובית) שנותן לערוך ישות מסויים, בוא נקרא לו "אבא". כל "אבא" משוייך לכמה בנים, יש דרישה שיהיה טופס אחד לערוך את האבא עם כל הבנים כולל אפשרות להוסיף בנים ולמחוק (לרצוח?) אותם.
    השאלה איך הכי נכון לבנות דבר כזה:
    א. בצד שרת יהיו רק APIs הגיוניים: לכל ישות endpoint משלו, ובעת שמירה, צד הלקוח יקרא בזה אחר זה (או במקביל) לכל ה-endpoint-ים, כלומר לחצן אחד יגרום לכל הפעולות הבאות: "ערוך את האבא", "מחק בנים אלו", "ערוך בנים אלו", "הוסף בנים אלו"
    ב. צד הלקוח יחייב שמירה בנפרד לכל ישות, אין שמירה של אבא-עם-הבנים על אף שאפשר לערוך את הכל בטופס אחד
    ג. בצד שרת יהיה endpoint נוסף שמטפל בעריכת-אבא-עם-בניו
    ד. הדרישה בכלל טפשית וצריך לשכנע את הדורש שזה לא נכון

    (אני קצת מערב פה שיקולים של UX ושיקולי הנדסת תוכנה)

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    dovidD תגובה 1 תגובה אחרונה
    3
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      השיב לyossiz ב נערך לאחרונה על ידי dovid
      #2

      @yossiz א-ג הם הנכונים.
      ב הגיוני רק במקרים בהם חשוב שהמשתמש יבין מה שקרה (זה אמור להיות מקרים נדירים ביותר, במשתמשים+פעולות מאוד טכניות גם בתפישה של המשתמש, וגם על זה ניתן להתגבר עם UX מוצלח).
      ד ודאי לא נכון, זה דרישה אולטרה לגיטימית לפחות במקרים שאני מדמיין בראשי.

      מתוך א, וג.
      א הוא הנכון לפי הספר, וגם בעצם מקל את התחזוקה בשני הצדדים. כי גם בצד הלקוח לא עובדים עם JSON שמייצג גרף מסובך אלא עובדים צעד אחרי צעד, כל שגיאה נמצא במקום מאוד מסויים הן בצד לקוח והן בצד שרת.
      (גם לפי הא', צריך לאפשר bulk לדעתי לאוסף מאותו סוג כמו עריכת בנים ולא עריכת בן, כי זה שינוי קטן בצד השרת והפחתת תקורת בקשות בצד הלקוח).
      למרות כל זאת, אני כמעט תמיד פועל כמו ג, כי זה מאפשר פיתוח מהיר בהרבה. אצלי יהיה endpoint אחד ויחיד שייקרא "עריכת-אב" והוא יטפל א. עריכת אב קיים ב. עריכת אב חדש, ג. הסרת בנים מהאב ד. הוספת בנים לאב.
      בדוטנט אני יעשה זאת עם מחלקת אב שיש לה מאפיין אוסף לבנים, ומאפיין אוסף נוסף לבנים למחיקה. כל אלמנט (אב או הבנים) ללא ID, זה אלמנט להוספה, כל אחד יש לו ID זה אלמנט לעריכה.
      (באלמנט לעריכה טוענים עותק מהמסד ועושים עדכון לכלל המאפיינים ברי העדכון (או חיפוש הבדלים מעצבן אם על הדרך מתעדים שינויים, מנסיוני זה פעולה קלה יותר בצד לקוח ואז שולחים טבלת שינויים ישות,מזהה,מאפיין,ערך ישן [לוידוא אי התנגשויות], ערך חדש).

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      yossizY תגובה 1 תגובה אחרונה
      5
      • yossizY מחובר
        yossizY מחובר
        yossiz
        השיב לdovid ב נערך לאחרונה על ידי yossiz
        #3

        @dovid
        גילוי נאות: כבר החלטתי מראש איזה תשובה אני רוצה לשמוע...
        ענית בדיוק מה שלא רציתי לשמוע (מה שכתבת ש"אצלי יהיה endpoint אחד ויחיד שייקרא "עריכת-אב" זו האופציה הכי גרועה בעיני ואפילו לא העליתי את זה כצד)

        דעתי:
        ד עדיף עבור נוחות הפיתוח ופשטות הקוד, אבל לפעמים הדרישה הגיונית או שהלקוח מתעקש
        בעדיפות שנייה הייתי עושה את ב, גם מטעמי פשטות, אבל גם כאן צריך לקחת את דרישות הלקוח בחשבון
        במקרה הצורך אני אוהב את ג על פני א אבל שיהיה בפירוש endpoint נוסף שקיים רק בשביל ה-UI הספציפי הזה. ל-endpoint הזה יש לשלוח 4 דברים: אבא, בנים להוסיף, בנים למחוק, ובנים לעדכן. הלוגיקה שמפצל את הבנים לשלושת החלוקות שאתה עושה בצד שרת, שייעשה בצד לקוח.
        א נשמע לי קצת מוגזם אבל זה דומה מאוד לג' רק שזה יהיה endpoint אחד ולא ארבע

        אשמח לשמוע עוד דעות, או טענות/שיכנועים למה אני לא צודק

        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

        א תגובה 1 תגובה אחרונה
        2
        • א מנותק
          א מנותק
          אהרן
          השיב לyossiz ב נערך לאחרונה על ידי
          #4

          @yossiz
          אשמח לדוגמא אמיתית
          במה מאפיין את ישות הבן כבן?

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

          yossizY תגובה 1 תגובה אחרונה
          1
          • yossizY מחובר
            yossizY מחובר
            yossiz
            השיב לאהרן ב נערך לאחרונה על ידי
            #5

            @אהרן כתב בבנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים:

            z
            אשמח לדוגמא אמיתית
            במה מאפיין את ישות הבן כבן?

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

            📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

            תגובה 1 תגובה אחרונה
            4
            • OdedDvirO מנותק
              OdedDvirO מנותק
              OdedDvir
              כתב ב נערך לאחרונה על ידי
              #6

              @yossiz אני מנסה להבין לאן אתה חותר. ברור לי שאין צורך לומר לך פוק חזי וכו' ואתה מכיר את הדרך המקובלת של RESTful API, על כל היתרונות והחסרונות שלה...
              שמא אתה מחפש דרך יעילה ואלגנטית יותר לבצע עדכונים היררכיים ב-API, בסגנון של GraphQL?

              dovidD yossizY 3 תגובות תגובה אחרונה
              3
              • dovidD מנותק
                dovidD מנותק
                dovid ניהול
                השיב לOdedDvir ב נערך לאחרונה על ידי dovid
                #7

                @OdedDvir כתב בבנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים:

                פוק חזי וכו' ואתה מכיר את הדרך המקובלת של RESTful API

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

                מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                בכל נושא אפשר ליצור קשר dovid@tchumim.com

                תגובה 1 תגובה אחרונה
                8
                • dovidD מנותק
                  dovidD מנותק
                  dovid ניהול
                  השיב לOdedDvir ב נערך לאחרונה על ידי
                  #8

                  @OdedDvir עוד יש להעיר, REST לא נועד לשרת צד לקוח סופי אלא שכבת אפליקציה שהיא מקבל הוראות מצד לקוח (כי הוא לא נועד למקרים של אימות והרשאות וכולי).
                  אז אפשר להיתמם ולראות את שאלתו של יוסי כשאלה על הנדסת התקשורת הנכונה בין שכבת האפליקציה לצד לקוח הסופי.

                  מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                  בכל נושא אפשר ליצור קשר dovid@tchumim.com

                  OdedDvirO תגובה 1 תגובה אחרונה
                  1
                  • OdedDvirO מנותק
                    OdedDvirO מנותק
                    OdedDvir
                    השיב לdovid ב נערך לאחרונה על ידי
                    #9

                    @dovid אתה מתכוון שהשאלה היא כיצד לעצב את חווית המשתמש בעריכה של נתונים היררכיים? מהניסוח של @yossiz הייתי תחת הרושם שכוונתו לדון על העיצוב המומלץ לשכבת API בצד השרת, אבל כעת אני מבולבל עוד יותר... למה התכוון המשורר?

                    dovidD תגובה 1 תגובה אחרונה
                    0
                    • dovidD מנותק
                      dovidD מנותק
                      dovid ניהול
                      השיב לOdedDvir ב נערך לאחרונה על ידי
                      #10

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

                      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

                      בכל נושא אפשר ליצור קשר dovid@tchumim.com

                      תגובה 1 תגובה אחרונה
                      3
                      • yossizY מחובר
                        yossizY מחובר
                        yossiz
                        השיב לOdedDvir ב נערך לאחרונה על ידי
                        #11

                        @OdedDvir כתב בבנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים:

                        ברור לי שאין צורך לומר לך פוק חזי וכו' ואתה מכיר את הדרך המקובלת של RESTful API,

                        האמת שאני לא מכיר, זה לא נושא שלמדתי בצורה מסודרת אף פעם
                        אולי תרצה לגלות לי מה יש ל-REST להגיד במקרה שלי?
                        אם היית שואל אותי, הייתי עונה בבורותי שאין לו מה להגיד בנושא הזה וזה לא עניינו
                        אשמח אם תכתוב בפירוש מה התשובה לפי פילוסופיית ה-REST

                        שמא אתה מחפש דרך יעילה ואלגנטית יותר לבצע עדכונים היררכיים ב-API, בסגנון של GraphQL

                        בהחלט הייתי מעדיף

                        📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                        OdedDvirO תגובה 1 תגובה אחרונה
                        0
                        • yossizY מחובר
                          yossizY מחובר
                          yossiz
                          כתב ב נערך לאחרונה על ידי
                          #12

                          @OdedDvir כתב בבנייה נכונה של API לעריכת ישות עם כמה ישויות קשורים:

                          שמא אתה מחפש דרך יעילה ואלגנטית יותר לבצע עדכונים היררכיים ב-API, בסגנון של GraphQL

                          אם אתה כבר מזכיר את זה, יש לי שאלה נוספת שחשבתי לפתוח עליה עוד נושא ש-GraphQL הוא פתרון גם לזה. השאלה הוא לגבי דפים ב-UI שכל אחד יש לו שגעון אחר, אחד רוצה JOIN של טבלה א' ואחד של טבלה ב' וג' וכו, איך מטפלים בזה? אולי באמת אפתח לזה נושא חדש

                          📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                          תגובה 1 תגובה אחרונה
                          0
                          • OdedDvirO מנותק
                            OdedDvirO מנותק
                            OdedDvir
                            השיב לyossiz ב נערך לאחרונה על ידי
                            #13

                            @yossiz אני גם לא למדתי את הנושא באופן מסודר, ומסתפק אם יש לי מה להוסיף לך בנושא, אבל כיון שביקשת:

                            בקצרה, RESTful API הוא סגנון עיצוב של ה-API בצורה [השואפת ל]כך שבקשות ה-HTTP שנשלחות אל ה-API יבצעו פעולה בהתאמה לסוג המתודה של הבקשה (HttpMethod), למשל:

                            POST ליצירה
                            GET עבור קריאה
                            PUT עבור עדכון
                            DELETE עבור מחיקה

                            וכן נקודות הקצה של ה-API יהיו במבנה מאורגן, בד"כ היררכי לפי סוג ישות\מזהה:

                            GET Users
                            GET Clients/123
                            DELETE Doctors/456
                            

                            ויחזירו קודים מובנים, כמו 200 עבור success ו-404 עבור not found.
                            כך שה-API אמור להיות אינטואיטיבי.

                            ב-CRUD פשוט הכל טוב ויפה, עד שמגיעים לפעולות קצת יותר מורכבות, בהם לא ברור כל כך איך להיות RESTful "טהור".
                            לדוגמא: עדכון חלקי של רשומה (מישהו אי פעם השתמש ב-PATCH ?), שיוך ישות-צאצא לישות-אב (האם הנתיב של פעולת שיוך מטופל לרופא, צריך להיות PUT Doctors/1/Patients/4 או אולי PUT Patients/4/Doctors/1 ?)

                            כיוון ש-REST הוא לא ממש סטנדרט, כמו ש@dovid הזכיר, הכאוס חוגג וכל אחד מעקם את הכללים כרצונו, מתכנת מתחיל יכול ליצור API endpoints מוזרות, כמו:

                            POST Doctors/delete?doctorid=123
                            GET Doctors/all
                            GET Doctors/2/delete
                            

                            ולשאלתך, דוד כבר ענה לך שלפי הספר הדרך היא ב.

                            chagoldC תגובה 1 תגובה אחרונה
                            5
                            • chagoldC מנותק
                              chagoldC מנותק
                              chagold
                              השיב לOdedDvir ב נערך לאחרונה על ידי
                              #14

                              https://dzone.com/articles/graphql-vs-rest

                              תגובה 1 תגובה אחרונה
                              2
                              • yossizY מחובר
                                yossizY מחובר
                                yossiz
                                כתב ב נערך לאחרונה על ידי yossiz
                                #15

                                @OdedDvir תודה על ההשקעה!
                                לענות על השאלה המקורית, אני מוודא שהבנתי אותך נכון: אתה טוען שב-API מבוסס REST כל בקשה אמור להתייחס לישות יחיד לבד?

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

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

                                📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

                                תגובה 1 תגובה אחרונה
                                1

                                בא תתחבר לדף היומי!
                                • התחברות

                                • אין לך חשבון עדיין? הרשמה

                                • התחברו או הירשמו כדי לחפש.
                                • פוסט ראשון
                                  פוסט אחרון
                                0
                                • דף הבית
                                • קטגוריות
                                • פוסטים אחרונים
                                • משתמשים
                                • חיפוש
                                • חוקי הפורום