המרה של fetch רגיל, ל-UrlFetchApp של גוגל סקריפט
-
שלום לכולם! אני לא רגיל לכתוב כאן..
מה שקורה איתי זה ככה:
אני מעוניין ליצור בקשה - מתוך סקריפט של גוגל סקריפט'ס - ל-API של גיטהב. במקרה שלי הבקשה היא לצורך הפעלה ידנית של workflow (כלומר github action).ההפעלה הידנית של פקודות בקבצי workflow מתבצעת באמצעות אחד משני אירועים המכונים - repository_dispatch או workflow_dispatch. הרי דוקו על ההגדרה בקובץ ה-yml וזה דוקו על צורת יצירת האירוע (מחוץ לגיטהב).
כדי לבצע כזו קריאה ב-fetch רגיל (JS מהקונסול של הדפדפן או מאפליקצייה וכדו') - אני צריך לכתוב כזה דבר בערך:
var myHeaders = new Headers(); myHeaders.append("Accept", "application/vnd.github.everest-preview+json"); myHeaders.append("Content-Type", "application/json"); myHeaders.append("Authorization", "token {{github-token}}"); var raw = JSON.stringify({"event_type":"start-example-workflow"}); var requestOptions = { method: 'POST', headers: myHeaders, body: raw, redirect: 'follow' }; fetch("https://api.github.com/repos/chaim-chv/reponame/dispatches", requestOptions) .then(response => response.text()) .then(result => console.log(result)) .catch(error => console.log('error', error));
אם אני מריץ את הקוד הזה בקונסול לדוגמא (כמובן עם הערכים הנכונים במיקום של הטוקן והריפו וכו') - זה שולח התראת אירוע עם הטקסט "start-example-workflow", כאשר בקובץ הyml עם ה-workflow בגיטהב הוא מוגדר לבצע איזה פעולה כשמגיע כזו התראה.
עד כאן טוב ויפה.
הבעיה שלי מתחילה כשרציתי להכניס את כל זה לסקריפט גוגל. כלומר שבתוך סקריפט מסוים, אני אוכל לשלוח כזו התראה לקובץ בגיטהב.
בגוגל סקריפט אין fetch. שם יש מודל אחר שנקרא UrlFetchApp (דוקו) ויש לו כמובן פרמטרים אחרים, ושיטת פעולה טיפה שונה.
אבל זה לא אמור להיות עד כדי כך שונה.
ניסתי להמיר את זה לצורה שתתאים, אבל כל אופן שניסתי תמיד מחזיר לי מגיטהב שגיאה 422, מה שאומר שלא הייתה בעיה באימות או בטוקן (במקרה כזה זה 401 וכדו'), אלא בעיה בפרמטרים של הבקשה. או בעברית - בקשה לא נכונה.הנה מה שניסתי:
function run() { var api = "https://api.github.com/repos/chaim-chv/reponame/dispatches"; var headers = { "Authorization": "token {{github-token}}", }; var options = { "Accept": "application/vnd.github.everest-preview+json", "Content-Type": "application/json", "headers": headers, "method" : "POST", "body" : '{"event_type":"start-example-workflow"}', }; var response = UrlFetchApp.fetch(api, options); var stat = response.getResponseCode(); var json = JSON.parse(response.getContentText()); Logger.log(stat); Logger.log(json); }
יש למישהו שמץ של רעיון לכווין אותי מה לא טוב בצורת הבקשה בגוגל??
-
@chv אמר בהמרה של fetch רגיל, ל-UrlFetchApp של גוגל סקריפט:
var options = { "Accept": "application/vnd.github.everest-preview+json", "Content-Type": "application/json", "headers": headers, "method" : "POST", "body" : '{"event_type":"start-example-workflow"}', };
לפרמטר האפשרויות של UrlFetchApp.fetch (בתצורה של url+params) כפי שאמרת האפשרויות שונות, ככה צריך להיות:
var headers = { "Authorization": "token {{github-token}}", "Accept": "application/vnd.github.everest-preview+json" }; var options = { "contentType": "application/json", "headers": headers, "method" : "POST", "payload" : '{"event_type":"start-example-workflow"}', };
ההבדל העיקרי זה שלbody קוראים payload (כל הכבוד גוגל שהצלחתם לשבור את התאימות )
האפשרות contentType אינה כפי שהיא בכותרת מופרדת במקף אלא כמילה אחת, וכל כותרת אחרת צריכה להיכנס לheaders (בזה זה כמו כמו הfetch הרגיל!). -
@dovid צודק תודה רבה!!! וואו איך שברתי את הראש... ועברתי על זה כמה פעמים ואף פעם לא שמתי לב באמת שpayloads זה הBODY (זה אכן כתוב במפורש בהסבר...)
תודה רבה זה עובד עכשיו מעולה!!אגב בנוגע להדרים accept או content-type - זה עובד גם איך שכתבתי לפני (מחוץ למערך של הheaders, וכן הcontent-Type כתוב עם מקף, ועובד...)
תודה תודה!!
-
@chv אמר בהמרה של fetch רגיל, ל-UrlFetchApp של גוגל סקריפט:
אגב בנוגע להדרים accept או content-type - זה עובד גם איך שכתבתי לפני (מחוץ למערך של הheaders, וכן הcontent-Type כתוב עם מקף, ועובד...)
ובלעדיהם זה לא עובד? כי גם אם תכתוב כמה מאפיינים אחרים שתמציא זה לא יקלקל, השאלה אם הכותרות משתנות בהתאם.
-
@dovid זה אכן עובד גם בלעדיהם. מה הפשט?
כלומר, אני לא כזה מבין במתודולגיה של כל הנושא הזה בקשות וכו', אבל זה בהחלט כתוב בתיעוד - הפירוט של content-type וגם ה-accept, אז משמע שזה נצרך.
איך זה עובד בלי זה?אשמח אם תסביר לי קצת מלמעלה, אולי אוכל להבין מה שורש העניין. סתם ככה בשביל לדעת.
-
@chv שתי דברים:
א. אתה אמור לא לישון בלילה על סיפור הקריסות, במקום לעשות מאה סקריפטים שפותרים את הבעיה.
ב. הפורום כבר לא בתשלום, החודש בע"ה לא תהיה גביה. אבל הוא גם לא בחינם, כלומר לא גיבשתי את הכללים החדשים להצטרפות... אני צריך לשבת על זה ואשמח לשמוע רעיונות למייל. -
@dovid אמר בהמרה של fetch רגיל, ל-UrlFetchApp של גוגל סקריפט:
אתה אמור לא לישון בלילה על סיפור הקריסות, במקום לעשות מאה סקריפטים שפותרים את הבעיה.
כמובן, אם זה היה משהו חשוב, נגיד לקוח וכדו'.
אבל כאן זה פשוט אתר שבניתי לתחביב, ואני לומד על הדרך הרבה יותר דברים.
(כמובן כמובן שניסתי להבין מה הדפיקה שגורמת לו לשכוח את הערכת נושא, לא הצלחתי. זה בטח איכשהו קשור להרוקו) -
@dovid אמר בהמרה של fetch רגיל, ל-UrlFetchApp של גוגל סקריפט:
אתה אמור לא לישון בלילה על סיפור הקריסות, במקום לעשות מאה סקריפטים שפותרים את הבעיה.
ובכן...
בסוף פתרתי את הבעיה (זה אכן היה כמו ששיערתי, טעות בבניה של האפליקציה בהרוקו. כלומר ההגדרות של ה-git לא שמרו נכון את הערכות נושא שמועלות על ידי המשתמש, ולכן בכל בניה מחדש של האפליקציה - נשכחו הקבצים, אבל ההגדרה עצמה נשארה).
אז אני לא צריך את כל הסקריפט עכשיו...אבל זה היה שווה כמובן. למדתי כאן כמה דברים חשובים, והכרתי כמה פלטפורמות יותר לעומק.
חוץ מזה שהיה לי על מה לכתוב