PracticU

חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1

בלי כתוביותעם כתוביות
PracticU › קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode › חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1
מילון מושגים:
API - ממשק תכנותי שמגדיר כיצד תוכנה אחת פונה לאחרת ומחליפה איתה נתונים ופעולות.
JSON - פורמט טקסט קריא לייצוג נתונים מובְנים כזוגות מפתח-ערך, נפוץ להחלפת מידע בין שרת ללקוח.
Xcode - סביבת הפיתוח של אפל לכתיבת אפליקציות ל-iOS ול-macOS.
HTTP - פרוטוקול להעברת דפי אינטרנט ונתונים בין דפדפן לשרת. הגרסה המאובטחת שלו היא HTTPS.
XML - שפת סימון לייצוג נתונים מובְנים בעזרת תגיות, המשמשת להחלפת מידע בין מערכות ולקובצי הגדרות.
UTF-8 - שיטת קידוד נפוצה של Unicode, שמייצגת כל תו במספר משתנה של בתים ותואמת ל-ASCII.
Unicode - תקן קידוד תווים אוניברסלי שמכסה את כתבי השפות בעולם, ומאפשר לייצג כמעט כל תו.

חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1
רוב הנתונים משרתים מרוחקים (API) מגיעים בפורמט JSON, ובשיעור הזה מלמדים איך להמיר אותם לאובייקטי Swift ובחזרה. העבודה נעשית ב-Playground עם הפרוטוקול Codable.
מה זה API ו-JSON
API הוא שרת שנותן שירות לאפליקציות: מידע על ספורט, חדשות, מזג אוויר, זיהוי פנים ועוד. שולחים אליו בקשת HTTP ומקבלים תשובה, בדרך כלל JSON ולפעמים XML. JSON הוא פורמט בינלאומי לייצוג אובייקטים. בדוגמה מוצגים האתר Rapid API, שמרכז הרבה APIs, ו-Google Places API.
השלבים העיקריים
1. Codable: פרוטוקול שמורכב מ-Encodable (אובייקט ל-JSON) ו-Decodable (JSON לאובייקט). אפשר לממש רק צד אחד. הדוגמה: struct בשם Person עם firstName ו-lastName, ומערך people.
2. אובייקטים ל-JSON: JSONEncoder מקבל את המערך ומחזיר Data. ממירים אותו למחרוזת ב-UTF-8. עם outputFormatting בערך prettyPrinted מקבלים הדפסה קריאה.
3. JSON לאובייקטים: מחרוזת של שלוש מירכאות כפולות לטקסט רב-שורות, המרה ל-Data, ואז JSONDecoder().decode([Person].self, from:).
4. שמות בסגנון snake_case: ב-keyDecodingStrategy בוחרים convertFromSnakeCase, והשדה first_name נקרא לתוך firstName.
5. CodingKeys: שדה כמו person_h שרוצים לקרוא לו h, ושדה אופציונלי שלא קיים אצל כולם. מגדירים enum בשם CodingKeys עם raw value מסוג String ומקצים לכל מפתח את השם ב-JSON.
6. תאריכים: שלוש אסטרטגיות לקידוד תאריכים: iso8601, שניות מאז 1970 (secondsSince1970) ו-formatted עם DateFormatter מותאם. בפורמט ISO 8601 יש אות T בין התאריך לשעה ו-Z לאזור UTC. בפורמטר מותאם מגדירים תבנית (year, month, day, שעות, דקות, שניות ו-xx לאזור זמן), ונעזרים בטבלת הסימנים של Unicode.
7. מבנה שלא מתאים: כש-JSON מכיל אובייקט name מקונן עם first_name ו-last_name, ורוצים אותם ישירות ב-Person, מממשים ידנית ב-extension את init(from decoder:). משתמשים ב-container, ב-decodeIfPresent לשדות אופציונליים וב-nestedContainer לשם.
8. הכיוון ההפוך: ב-extension נוסף מממשים encode(to:) עם container(keyedBy:), ויוצרים nestedContainer מסוג var עבור name.
9. תאריך ביציאה: כשמקודדים בחזרה, קובעים dateEncodingStrategy עם הפורמטר, ו-timeZone של הפורמטר ל-UTC כדי שלא יתווסף +2.
שימו לב
- ההדפסה האוטומטית של המערך נראית מוזרה כי לא מימשו description.
- שדה שאינו קיים אצל כל האובייקטים חייב להיות אופציונלי.
השיעור הבא נותן דוגמאות מקיפות, כמו ה-JSON של Google Places. אחרי השיעור אפשר להמיר JSON לאובייקטים ובחזרה, כולל שמות שונים, תאריכים ומבנים מקוננים.
השיעור הבא בקורס: חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 2

פרקי ההרצאה: חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1

  1. 00:00

    מה הם APIs ואתר Rapid API

  2. 01:15

    דוגמה ל-JSON מ-Google Places API

  3. 02:27

    הכרת הפרוטוקול Codable

  4. 04:29

    Playground עם struct של Person

  5. 06:36

    המרת מערך ל-JSON עם JSONEncoder

  6. 08:55

    המרת JSON למערך עם JSONDecoder

  7. 11:53

    המרת snake_case ל-camelCase

  8. 13:58

    שדה אופציונלי ב-JSON

תמלול ההרצאה: חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1

הטקסט המלא של הדקות הראשונות בהרצאה «חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 1» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    שלום וברוכים הבאים בחלקים הבאים של הקורס אנחנו רוצים לעבוד עם מידע שמגיע משרתים מרוחקים שגם קוראים להם APIs והמידע הזה מגיע בצורת JSON אז לפני שנמשיך אנחנו רוצים בכלל לראות מה זה APIs ומה זה JSON אז בואו נעיף מבט נקפוץ רגע לדפדפן ובואו נחפש יש אתר מאוד נחמד שנקרא Rapid API

  2. 00:25

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

  3. 00:42

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

  4. 01:06

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

  5. 01:21

    אז בוא נסתכל על איזשהו API לדוגמה שנותן ג'ייסון, בוא נעיף מבט נגיד ב-Google Places API. Google Places API פשוט נותן מידע על Places, אוקיי?

  6. 01:35

    עכשיו הקריאה לעבודה עם הדבר הזה זה שרת מרוחק, אז אנחנו נפנה לכתובת הזאת, כתובת אינטרנט, ואנחנו נקבל ממנה תשובה. אז IPI נותן לי פשוט תשובה בפורמט, לרוב JSON, יכול להיות גם פורמט של XML.

  7. 01:49

    אנחנו שולחים אליו בקשות אינטרנט, בקשות HTTP, ואז אנחנו מקבלים את ה-Response שיכולה להיות או JSON או XML במקרה של Google Places, ובואו נסתכל רגע על התשובה.

  8. 02:00

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

  9. 02:14

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

  10. 02:24

    עכשיו כמובן שאפשר לחפש כל מיני דברים ב-API ולקבל כל מיני תשובות ופה אנחנו מקבלים עוד מידע על מקומות, למשל מיקום, אייקון, תמונות, שעות פתיחה וכן הלאה.

  11. 02:38

    אנחנו רוצים ללמוד לעבוד עם ג'ייסון בסוויפט אוקיי ולמה אנחנו רוצים לעבוד עם ג'ייסון בסוויפט כדי שבהמשך המודול נוכל ללמוד לעבוד גם עם APIs. בסוויפט כדי לעבוד עם ג'ייסון אנחנו נשתמש בפרוטוקול שנקרא קודאבל בוא נעיף עליו מבט ראשוני ואחר כך נצלול יותר לעומק אנחנו נרשום בגוגל קודאבל סוויפט כדי להגיע לדוקומנטציה ואנחנו ניכנס לאפל developer כדי

  12. 02:39

    לראות את הדוקומנטציה הזאת בסופו של דבר קודאבל לפי מה שכתוב פה זה פרוטוקול שמורכב משתי חלקים, Decodable ו-Encodable.

  13. 03:16

    עכשיו יש תהליך של בעצם סיריאליזציה ודה-סיריאליזציה ולכן יש פה שתי חלקים לפרוטוקול. בואו נסתכל ב-First Steps, צעדים ראשונים, איך לעבוד עם האובייקטים שלנו ולהפוך אותם ל-JSON ומי-JSON.

  14. 03:29

    אז נסתכל בדוקומנטציה כדי לקבל איזשהו Overview וכאן אומרים לנו בעצם את מה שאנחנו כבר יודעים, נכון? הרבה משימות בתכנות דורשות להביא מידע מהאינטרנט ולשמור את המידע בחזרה ל-APIs ושירותים כאלה כמו שראינו קודם.

  15. 03:45

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

  16. 04:06

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

  17. 04:29

    טוב, אז בואו נקפוץ רגע לסוויף ונעשה איזשהו פרויקט כדי להתחיל לקבל את המידע. אני אייצר פלייגראונד הפעם ובואו נעשה פלייגראונד ריק בלאנק נגדיל את זה כדי שנוכל לראות את זה ככה בצורה מוצלחת ונקרא לפלייגראונד שלנו json.playground

  18. 04:51

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

  19. 05:25

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

  20. 05:55

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

  21. 06:20

    עכשיו, בגלל שזה פרוטוקול שהוא צירוף של פרוטוקולים, הייתי יכול לממש רק Decodable או רק Encodable.

  22. 06:29

    אבל אנחנו רוצים את שתי הכיוונים, בסדר? גם סריאליזציה וגם דה-סריאליזציה, גם ל-JSON וגם מי-JSON. אז עכשיו אנחנו רוצים לקחת את המערך הזה ולייצר ממנו JSON.

  23. 06:39

    איך אנחנו מייצרים JSON? convert objects to JSON. אז איך אנחנו מייצרים ג'ייסון? מאוד פשוט, יש לנו אובייקט שנקרא ג'ייסון סליחה יש לנו אובייקט שנקרא ג'ייסון אנקודר והוא יודע לעשות אנקודינג אוקיי?

  24. 07:07

    עכשיו האנקודר שלנו אנחנו פשוט ניתן לו את המערך והוא בהינתן זה שהוא קודאבל האובייקט אז אין לו שום בעיה לעבוד איתו והוא יהפוך אותנו לג'ייסון דאטה. אז בוא נגיד let json data שווה ואנחנו נבקש מהאנקודר שלנו אבל המתודה הזאת זורקת שגיאה אז בואו כבר מיד נעשה טריי.

  25. 07:27

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

  26. 07:41

    דאטה, אוקיי? דאטה זה מידע בינארי. אם אתם רוצים לראות את זה כסטרינג, אז בואו נמיר את זה לסטרינג, let jsonString שווה לסטרינג חדש מדאטה, ואני אתן לו את ה-JsonData שיש לנו עכשיו, וגם אנחנו רוצים להגיד לו שה-Encoding הוא UTF-8.

  27. 08:06

    אוקיי, אז זה ה-String של ה-Json, אפשר להדפיס אותו ולראות אם הצלחנו לקבל ג'ייסון סטרינג. זה אופציונל, אז בואו נעשה פה סימן קריאה גם כן, כי אנחנו שוב פעם יודעים בוודאות שזה הולך להצליח, ונריץ את הפלייגראונד.

  28. 08:21

    יפה, אז הנה התוצאה פה. כמו שאתם רואים, ההדפסה היא לא משהו, והיינו רוצים שהג'ייסון שלנו יהיה יותר יפה קצת, נכון? שירד שורות וכן הלאה.

  29. 08:29

    יש אופציה כזאת גם כן בג'ייסון אנקודר לבקש ממנו שיודפיס לנו יפה. אז encoder.format וכאן אנחנו רוצים להגיד שאנחנו רוצים pretty printed format כלומר שיתפיס לי את ה-JSON בצורה יפה נריץ את זה שוב פעם והנה יש לנו פה למטה את ה-JSON בפורמט נחמד ונעים אוקיי בסדר זה הצעד הראשון נכון אנחנו ככה מקבלים את זה בתור צעד ראשון עכשיו

  30. 08:58

    נניח שקיבלתם JSON מהאינטרנט אוקיי בואו נשים רגע את כל אלה בהערה כדי לא להעמיס על עצמנו יותר מדי ונניח שקיבלתי את ה-JSON הבא לג'ייסון מהאינטרנט עכשיו אני אלך פה על סטרינג עם שלוש מירכאות שמה שזה אומר זה מולטיליין סטרינג ואז אני יכול פשוט להדביק פה את הג'ייסון שקיבלתי פה בקונסול אוקיי ופשוט זה מאפשר

  31. 09:09

    לי לשמור על כל הפורמט שהיה קודם בצורה נחמדה ונעימה ולכן הלכתי פה על מולטיליין סטרינג אוקיי אז יש לי סטרינג ואנחנו עכשיו רוצים לקבל ממנו מערך אוקיי סריאליזציה ודה סריאליזציה אז אם אנחנו רוצים להפוך את זה למערך קודם כל אנחנו צריכים דאטה data מסטרינג זה לא בעיה יש לנו פשוט let json

  32. 09:48

    data שווה לסטרינג שיש לי נקודה data הוא פשוט שואל אותי באיזה נקודינג אז בוא נגיד utf-80 יפה אז הנה יש לי דעית כבר ועכשיו איך אני לוקח מזה מערך אז אנחנו צריכים לעבוד עם json decoder אני אקרא לזה פשוט decoder ועל הדקודר שלי אני רוצה פשוט לבקש ממנו שייתן לנו מערך של people

  33. 10:22

    אז זאת מתודה שזורקת שגיאה, אז בואו נעשה את ראי כמו קודם, ו-decoder.decode, ואני אגיד לו איזה טייפ אני מצפה לקבל, אני מצפה לקבל מערך של פרסון, אז בואו נגיד מערך של פרסון, וכדי להגיד לו את הטייפ אני צריך להגיד .self, שזה מה שמחזיר לי את המערך .type, יפה, הוא רוצה ממני את הדאטה,

  34. 10:47

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

  35. 11:10

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

  36. 11:28

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

  37. 12:00

    הבסיסי אבל יש לזה הרבה התפתחויות ואנחנו רוצים ללמוד אותן. הרבה פעמים ב-JSON אנחנו מקבלים שמות שלא מתאימים לנו מבחינת Swift. בואו אני אראה לכם דוגמה כזאת ב-Rapid API, יש פה מזג אוויר API, בסדר? weatherbit.io נותן את המידע שלו בצורה הבאה.

  38. 12:20

    אנחנו מקבלים wind_directionstatecode עם underscore city name אלה שמות שהם נהוגים בעולם ה-Web אבל הם לא מתאימים ב-Swift, נכון? מוסכמות לגבי שמות ב-Swift זה ללכת על camelcase ואז אנחנו נרצה לרשום ווינד ובדיר אנחנו נרצה לרשום את זה בדי גדולה אז איך אנחנו יכולים להתמודד עם ג'ייסון כזה בואו ניקח את הדוגמה הזאת בפרסט ניים שלנו

  39. 12:43

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

  40. 13:04

    אופציה אחת זה להתפשר ולקרוא לזה first underscore name ואז זה יעבוד כרגיל אין לי מה להוסיף אבל אם אתם לא רוצים להתפשר ואתם בכל זאת רוצים לקחת את הג'ייסון הזה ולהמיר אותו לאובייקטים שלכם מה שאתם תצטרכו לעשות זה במקרה שלנו פשוט להגיד לדקודר לעשות עבורנו את התרגום אז יש לנו פה את הכי

  41. 13:26

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

  42. 13:57

    השם שלו בכלל אוקיי למשל הוסיפו לנו בג'ייסון שדה שנקרא person h אוקיי עכשיו בוא נגיד שזה יהיה 20 שמתי פה מספר אוקיי עכשיו צריך לבוא פה פסיק בגלל איך שהפורמט של ג'ייסון מוגדר.

  43. 14:18

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

  44. 14:28

    אם ככה, אנחנו נגדיר את h כאופציונל. הוא יהיה נגיד מספר אבל אופציונל, וזה גם מותר לנו לעשות.

לקורס המלא: קורס פיתוח אפליקציות לאייפון

ההרצאה הקודמת: מסך הגדרות לאפליקציה ב-Xcode-Swift

ההרצאה הבאה: חיבור ל-API בשרת בפורמט JSON ב-Xcode-Swift - חלק 2

הרצאות קשורות מקורסים אחרים

  • JSON
  • מה זה JSON
  • חיבור של theHarvester עם Shodan בעזרת API KEY
  • תיקון תקלות בשרת

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון