
URLSession ומעדכנים את הממשק בתשובה. הדוגמה היא API שמקבל שם פרטי ומחזיר את המגדר שלו.API וקובץ APIManager. ה-API דורש הרשמה וקבלת API key. ב-struct נשמרים apiKey ו-urlString (הכתובת בלי הפרמטרים).check: מקבלת שם (name) ו-callback מסוג @escaping שמקבל String? (המגדר).name ו-key. הפרמטרים של ה-API הם name ו-key.URLQueryItem: params.map { URLQueryItem(name: $0.key, value: $0.value) } היא מקבילה לולאה שמוסיפה פריט לכל זוג. היתרון של URLQueryItem הוא קידוד אוטומטי של התווים, למשל שם בעברית שמומר לרצף תווים חוקי בכתובת. אנגלית לא משתנה.URLComponents(string: urlString), השמה של queryItems, ואז .url. הסדר של הפרמטרים לא משנה.URLRequest(url:). אפשר לקבוע httpMethod (ברירת המחדל GET), httpBody ו-allHTTPHeaderFields, למשל accept עם application/json, אבל ה-API הזה לא דורש זאת.URLSession.shared.dataTask(with:completionHandler:), ו-resume() להתחלת המשימה. URLSession שומר cache, ולכן חיפוש חוזר מחזיר מיד.GenderResponse עם name, nameSanitized, country, gender, samples, accuracy, duration ו-creditsUsed. JSONDecoder עם keyDecodingStrategy = .convertFromSnakeCase. בניסוי הראשון התקבלה קריסה כי המפתח samples נכתב עם שגיאה.dataTask רץ כבר ב-thread משני, ולכן אין צורך ב-GCD ידני, אבל עדכון הממשק, כולל קריאה ל-callback עם nil בשגיאה, חייב לרוץ ב-DispatchQueue.main.async.UIActivityIndicatorView (עם hidesWhenStopped) שמופעל לפני הבקשה ונעצר אחריה. בלחיצה, המגדר שחוזר מוצג בכותרת הכפתור.הטקסט המלא של הדקות הראשונות בהרצאה «שרת HTTP שליחת פרמטרים ב-Swift-Xcode» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום וברוכים הבאים, אנחנו רוצים להתחיל לעבוד עם שרתים מרוחקים ולעבוד עם בעצם אתרים שנותנים לנו מידע מ-HTTP או HTTP Secure.
אנחנו נתחיל בלעשות איזושהי הכירות עם הפרוטוקול הזה שנקרא HTTP שמשמש העברת מידע דרך האינטרנט ואנחנו נלמד איך להעביר פרמטרים ל-HTTP, איך לבצע בקשות HTTP בפועל בסוויפט, איך לעבוד עם URL Session והיתרונות שלו וגם אנחנו נרצה דוגמה ממשית כדי איך לעבוד עם איזשהו שרת חיצוני או api כמו שאמרנו בשיעורים הקודמים
ולבסוף אנחנו גם נרצה לעדכן בזה את הממשק משתמש עם התוצאות אז כל הדברים האלה אנחנו רוצים לעשות בסרטון אמרנו שנתחיל עם היכרות עם פרוטוקול ה-http אז בואו ננסה לעשות את זה לצורך העניין בואו נפתח פה איזשהו דפדפן ונחפש בגוגל http וניכנס לוויקיפדיה לראות מה יש שם אנחנו ניכנס לוויקיפדיה באנגלית כי המידע פה יותר מפורט מעט ובקשות ה-HTTP הן בסופו
של דבר בקשות טקסטואליות, זאת אומרת יש לנו פה את המבנה של בקשת ה-HTTP כלשהי, והם מסבירים לנו פה את החלקים, כדאי להסתכל על החלקים לפחות, אנחנו יכולים לראות שהסכמה נקראת ה-HTTP, אנחנו יכולים לראות שכל הדבר הזה נקרא אוטוריטי, שהאוטוריטי מורכב מ-user info ו-host,
בדרך כלל בבקשות אינטרנט יהיה לכם רק את ה-host, אלא אם כן אתם פונים לאיזשהו שרת של נגיד SQL, ומעבר לאוטוריטי שבחלקו יש את ההוסט, לפעמים אתם תצטרכו לציין את מספר הפורט, למרות שבדרך כלל מספר הפורט לא חייבים לציין אותו, ואז אתם תרצו לציין את הנתיב בתוך ה-URL, זאת אומרת בתוך הדבר הארוך הזה שנקרא URL,
אתם תרצו לציין את הנתיב לאן אתם הולכים, אז אם נגיד אתם הולכים ל-example.com, בתוך זה אתם תרצו ללכת לאיזשהו נתיב שנקרא slash forums/שאלות, ואחר כך, אתם תוכלו בצורה אופציונלית גם להעביר פרמטרים, להעביר query parameters.
בסופו של דבר, יש פה גם איזשהו פרגמנט עבור ה-ID, אבל זה לא ישמש אותנו בדוגמאות שלנו. אנחנו נרצה להכיר כאן את החלק הזה של הפרמטרים, של ה-query parameters, אנחנו נרצה לדעת שיש את ה-host, בסדר? ואנחנו נרצה גם להעביר איזשהו פאפ ל-API שאני רוצה לעבוד איתו.
יש את הכתובת אוקיי ואנחנו נצטרך לעבוד על הכתובת במיוחד איך להעביר לתוך הכתובת פרמטרים זה דבר ראשון דבר שני שאנחנו רוצים לדעת על בקשות http זה שהם קודם כל יש מספר בקשות http יש בקשות get בקשות פוסט בקשות update delete וכן הלאה ובנוסף ברגע שאתם שולחים בקשת http אז בקשת http מורכבת
קודם כל מהפרוטוקול ואיזה דף אנחנו רוצים לקבל בסדר מהאתר נגיד את נתיב באתר, את הפאף, ובנוסף אפשר לשלוח גם הדרים עם בקשת ה-HTTP, אנחנו נסתכל על זה בסוויפט, ובנוסף אפשר גם לשלוח באדי בתוך בקשת ה-HTTP, שבמידה ויהיה לנו צורך אנחנו גם כן נעשה את זה.
לרוב הבקשות שלנו יסתדרו יפה מאוד עם פשוט לתת את ה-URL, אבל בתוך ה-URL אנחנו נרצה לשרשר את ה-Query Parameters, ומדי פעם אנחנו נצטרך להעביר לבקשה גם דברים כאלה שנקראים headers או request body תלוי ב-API אוקיי קצת תיאוריה פה אני יודע אבל שווה ככה לעבור ולהכיר דרך אגב לגבי ההדרים שאתם יכולים להעביר אם אנחנו כבר בקטע של תיאוריה
אז בואו נלחץ פה על הדרים שאפשר להגיד לשרת להביא לנו למשל אני יכול להגיד לשרת שאני רוצה לעבוד או לקבל מהם תשובות ב-UTF-8 אז אני יכול להגיד להם אני מעדיף לקבל תשובות ב-UTF-8 בנוסף, אנחנו יכולים להגיד שאנחנו מעדיפים לקבל תשובות בפורמט של Detect HTML או Application JSON או Application XML, כלומר, אנחנו רוצים לקבל את התשובה באיזשהו
פורמט. בנוסף, אפשר לבקש מהשר"ט עוד כל מיני דברים מסודרים, וזה נקרא עדרים, בסדר? זאת אומרת, זה מידע נוסף שנשלח עם הבקשה, ובעדרים אתם יכולים לשלוח לו נגיד את התאריך שלכם, ואז אולי הוא יוכל להתאים לכם את המידע עבור התאריך הזה, וכך הלאה.
טוב, שוב פעם, הרבה תיאוריה, אז בואו נקפוץ רגע לאיזשהו API כדי לסדר את התיאוריה הזאת מול המציאות. אנחנו נעשה שימוש ב-API מאוד מאוד פשוט, כל הקטע פה זה לתת דוגמה פשוטה ומובנת.
אנחנו ניכנס ל-genderapi.com, אתם תצטרכו לעשות sign up for free, בסדר? כדי להיות מסוגלים להשתמש ב-API, ומה שה-API נותן לכם, אתם מכניסים שם ומקבלים ג'נדר.
אז אם נגיד אני אכתוב משה, ואני אלחץ פה גם שאנחנו לא רובוט, אז אנחנו נצפה לקבל איזושהי תשובה והתשובה היא בפורמט הבא אוקיי אבל הפורמט הזה הוא ג'ייסון ואנחנו מכירים אותו ולא מה שעניין אתכם פה זה הג'נדר נגיד מייל או פימייל אז בוא ננסה עוד אחד נגיד דפנה ונעשה גו והפעם דפנה הג'נדר שלה הוא פימייל וזה גם כתוב פה
בתוך הג'ייסון אוקיי עכשיו איך אנחנו משתמשים בAPI אז יש לנו פה כתובת נכון ואפשר להעביר לכתובת הזאת כל מיני פרמטרים למשל name שווה Elizabeth and key שווה your key בואו נקפוץ רגע לAPI docs כאן יש לנו דוגמא קצת יותר קלה להבנה רוצים שנעשה בקשת HTTP מסוג get הכתובת תהיה הכתובת הבאה וברגע שזה יהיה הפאפ דרך
אגב זה יהיה אוטוריטי זה יהיה הפרוטוקול וברגע שאנחנו נגיע פה לנתיב הבא אנחנו נצטרך להעביר שתי פרמטרים א' את השם אפשר גם להעביר country אם רוצים אבל זה לא חובה ובנוסף אנחנו נצטרך להעביר גם את ה-API Key.
אוקיי, אז בואו נראה רגע איך אנחנו עושים את כל הדבר הזה בסוויפט. מה שאנחנו נרצה לעשות קודם כל זה לקבל את ה-API Key שלנו, ודבר שני אנחנו נרצה להעתיק מפה את הכתובת.
אז כדי לקבל את ה-API Key שלנו, בואו נלך פה ל-My Account, נעשה לוגין, יש לנו פה את הדוגמה למטה שכוללת את ה-API Key, בסדר? והנה ה-API Key עצמו.
מה שאנחנו נעשה אנחנו נעתיק רגע את זה קופי ונלך בחזרה לאקסקוד ונתחיל לעבוד אז אנחנו הולכים לאקסקוד עכשיו ופייל ניו פרויקט אנחנו נלחץ על סינגל ויו אפ ואנחנו רוצים לקרוא לדוגמה שלנו נניח ג'נדר API אוקיי עכשיו אנחנו נתקדם הלאה ונשים פרויקט חדש ונפתח את הדבר הזה בחלון מלא עכשיו בשביל לעבוד עם ה-API רצוי שיהיה לכם פה איזשהו מודלים של עבודה עם ה-APIs
אז בואו נעשה איזשהו גרופ חדש, ובתוך הגרופ נכתוב API, נקרא לגרופ שלנו API, סליחה. אז אני אעמוד פה ואני אעשה Rename, ובתוך ה-API, זה פשוט תקייה מסודרת לעבודה, נכון? עכשיו, בתוך ה-API בואו נייצר לעצמנו איזשהו Swift פייל, נקרא לו API Manager, ואיתו ככה נעבוד עם ה-API.
אוקיי, עכשיו, בקובץ שלנו אנחנו נרצה בעצם לייצר לעצמנו איזשהו Structure ל-API Manager שאיתו נעבוד.
יהיו לנו פה שדות כמו private let api-key ובוא נשמור פה אולי גם את הכתובת שקיבלנו אז נדביק פה את הכתובת אני אגזור מהכתובת אני מה שאנחנו נעשה הוא נעתיק רגע את כל זה שעדיין יהיה לנו בקופי פייסט בקליפ בורד אבל אנחנו נשאיר רק את ה-api-key בצורה הזאת מעבר ל-api-key אנחנו נרצה לשמור לעצמנו גם את ה-url סטרינג אז private let url סטרינג ובוא נדביק פה את כל הדבר הזה רק בלי הסימן שאלה והפרמטרים כי אותם אנחנו נרצה
להכניס בנפרד אוקיי אז יש לנו פשוט את הנתיב של האתר ויש לנו גם את ה-api-key ואנחנו זוכרים שלשתי השדות האלה אנחנו נצטרך לקרוא להם name ו-key אוקיי זה יהיה ה-key בהשרת שלהם וזה יהיה ה-name ואתם יודעים מה כדאי לכם לשים פה הערה גם עם כל הכתובת כמו שהייתה קודם כדי שתדעו בסוף בסוף מה צריך לצאת לכם אז יופי, זה הסטרקצ'ר שלי, עכשיו בואו נייצר
פונקציה שמקבלת שם ומחזירה לנו את אג'נדר, אוקיי? אז בואו נקרא לפונקציה הזאת צ'ק והיא תקבל מאיתנו name שהוא יהיה סטרינג ואיך אנחנו נחזיר את התוצאה? אנחנו נחזיר את התוצאה על ידי שימוש בקולבג שלמדנו בשיעורים הקודמים אז אתם מוזמנים להסתכל שם אנחנו נייצר קלוז'ר בעצם שהוא אסקייפינג והקלוז'ר שלנו יהיה קלוז'ר שמקבל סטרינג סימן
שאלה עבור אג'נדר ולא מחזיר ערך אוקיי אז אנחנו נרצה לקבל שם ובקולבק לענות מה יהיה האג'נדר אוקיי זה יהיה האג'נדר שיתקבל כתוצאה מהשאלות יפה עכשיו פרמטרים שאנחנו רוצים להעביר בוא נגיד שנגדיר אותם כרגע כדיקשונרי הסיבה שאני מגדיר אותם כדיקשונרי היא שבהרבה API הרבה סליחה דוגמאות בסוויפט
מגדירים אותם כדיקשונרי דיקשונרי מילון כן דיקשונרי והאמת היא שיש איזשהו ספרייה נחמדה שנקראת אלמו פייר שהיא ממש מקבלת אותם כדיקשנריס ולכן אתם תראו באינטרנט המון דוגמאות שעובדות עם אלמו פייר דווקא והן עובדות ככה אז אתם תרצו לעבור מדיקשנרי למה שאתם צריכים אז אנחנו עוד מעט נראה למה אנחנו
רוצים לעבור מה שכן הפרמטרים אז קראנו לזה params הם יהיו name וב-name אנחנו ניתן את ה-name שקיבלנו פה בפרמטר למעלה ואחרי ה-name יש לנו גם את ה-key נכון את ה-api key אז ה-api key בואו נכניס אותו גם כן פנימה פה פשוט נכניס את self.api.key טוב אז בעצם יצרנו dictionary מהפרמטרים שאנחנו צריכים לעבור להעביר ל-API נכון מהדברים האלה name שווה
אליזבת ו-key שווה ה-key שלנו אבל זה בתור dictionary כדי להמיר את זה לסוויפט בעצם אנחנו נרצה להשתמש ב-query items אוקיי אז בואו נראה מה זה אומר בעצם אנחנו נעשה דבר כזה אנחנו נרוץ על כל הפרמטרים שקיבלנו ונמיר אותם ל-query items כדי לעשות את זה אז let queryItems items שווה ובעצם אנחנו
רוצים לקחת את הפראמס את הדיקשנרי ולהמיר אותו למערך בעצם של queryItems כדי לעשות את זה אנחנו פשוט אומרים params.map ואנחנו ניתן לו פונקציה טרנספורמציה שתיקח צמד של key value ותכניס לי את זה בתור queryItem בתור מופע של queryItem בואו נעשה את זה בדרך הפשוטה ואחר כך אני אראה לכם כאילו אולי את הדרך שאתם הייתם עושים את זה בה
אז ברמס מפ, כאן אני מעביר לו פשוט את ה-query items, ה-url query item, ואני פשוט נותן לו את הבנאי של זה, אוקיי?
עכשיו, מה אני מקבל פה בצד? אנחנו מקבלים פה מערך של url query item. אז בעצם רצתי פה על כל אחד מאלה והפכתי אותו ל-query item. בואו נראה לכם את הדרך הנאיבית לעשות את זה.
אולי אתם לא הייתם מן הסתם עולים על השיטה הזאת בעצמכם, אז בואו נראה מה זה בעצם עושה. זה די מקביל ליצר מערך var arr שווה מערך חדש של query items url query items אוקיי מערך חדש ואז לרוץ על הדיקשנר הזה של הפראמס key value 11 for נגיד key.val in הדיקשנרי של הפרמטרים ולהכניס לתוך המערך query item חדש url query item חדש ואנחנו מעבירים לו name
וvalue אז זה בעצם ה-Key וה-Value מלמעלה. כמו שאתם שמים לב זה קצת ארוך, נכון? עשיתי את זה קודם בדיוק בדיוק את אותה פעולה אבל בשורה אחת אני בעצם אומר אני רוצה למפות וזאת בעצם Higher Order Function Map, אוקיי? אני רוצה להשתמש בפונקציה Map שמה שהיא יודעת לעשות היא יודעת לרוץ על כל ה-Dictionary
איזה Key Value Pair ולעשות איתו משהו. אז מה שאמרתי לה זה שתיקחי את הבנאי של URL Query Item ועבור ה-Name תכניסי את הפרמטר הראשון, את ה-Key ועבור ה-Value תכניסי את הפרמטר השנית הvalue וכל הדבר הזה זה בעצם בדיוק עלולה פה שכתובה למטה מדהים אוקיי עכשיו אולי אתם שואלים את עצמכם למה אני צריך להשתמש
ב query items בכלל אז query items עושים בשבילנו עבודה מאוד מאוד נחמדה וחשובה והם לוקחים בשבילנו את מה שכתוב פה למעלה את הapi key אבל גם את הname והם יודעים לקחת אותו