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

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

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

API רחובות לפי שכונות\ שכונות לפי ערים

מתוזמן נעוץ נעול הועבר תכנות
47 פוסטים 9 כותבים 2.2k צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • י מנותק
    י מנותק
    יוסף בן שמעון
    השיב לdovid ב נערך לאחרונה על ידי
    #35

    @dovid כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

    ה אכן משונה, אולי זה קשור לפרוקסי של אנגולר (שזה רלוונטי במצב dev בלבד, בפרודקשיין הכל מתחיל ונגמר בדפדפן ולכן תמיד יהיה CORS)

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

    תגובה 1 תגובה אחרונה
    2
    • י מנותק
      י מנותק
      יוסף בן שמעון
      השיב לyyy ב נערך לאחרונה על ידי
      #36

      @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

      זה הקוד האנגולרי:

      קח טיפ, עדיף לבנות את ה URL עם המחלקה המובנית בדפדפן, זה יותר אלגנטי ויותר קל לתחזוקה

      const tmpUrl = new URL('https://www.nadlan.gov.il/Nadlan.REST/Main/GetNeighborhoodsListByCityAndStartsWith');
      tmpUrl.searchParams.append('cityName', 'ירושלים');
      console.log(tmpUrl.href)
      
      תגובה 1 תגובה אחרונה
      3
      • י מנותק
        י מנותק
        יוסף בן שמעון
        השיב לyyy ב נערך לאחרונה על ידי
        #37

        @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

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

        באמת תמוה, נראה באג (ממשלה בכל זאת)
        לפעמים נשלח ההידר Access-Control-Allow-Origin פעם אחת בלבד, לפעמים הוא נשלח פעמיים עם תכנים שונים והדפדפן לא יודע איך להתמודד עם זה

        תגובה 1 תגובה אחרונה
        0
        • י מנותק
          י מנותק
          יוסף בן שמעון
          השיב לyyy ב נערך לאחרונה על ידי
          #38

          @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

          כלומר מה שכתבת :

          אין דרך בעולם לדעת אם קליינט שלח או שרת.

          לכאורה אינו מדוייק, אמת?

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

          תגובה 1 תגובה אחרונה
          2
          • י מנותק
            י מנותק
            יוסף בן שמעון
            השיב לyyy ב נערך לאחרונה על ידי
            #39

            @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

            כשאני שולח ישר מה-URL של הדפדפן זה תמיד עובד.

            כי חסימת CROS מתרחשת רק בבקשות חוצות דומיינים, דהיינו כשאתה שולח בקשת AJAX מתוך אתר A לדומיין B, אם אתה פותח לשונית חדשה ומכניס את ה URL אין בעיה של CROS

            תגובה 1 תגובה אחרונה
            2
            • י מנותק
              י מנותק
              יוסף בן שמעון
              כתב ב נערך לאחרונה על ידי
              #40

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

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

                @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

                כלומר מה שכתבת :

                אין דרך בעולם לדעת אם קליינט שלח או שרת.

                אין סתירה בין השניים.
                האתר הממשלתי הזה כמו כל אתר, לא יכול לדעת אם בקשה הגיעה מאנגולר (צד לקוח) או PHP/NODE (צד שרת).
                אלא שבצד לקוח יש לך בעיות "בירוקרטיות" עם הדפדפן שמסרב לאפשר לקוד לקבל את מבוקשו כי הוא רץ תחת דומיין אחר (במקרה שלך localhost).
                הייתי מציין לך את ההבדל אם לא שבדבריך ביטאת סיפור הפוך:

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

                כלומר אתה טענת שבדפדפן עובד (התכוונת לשורת הכתובת) ובשרת (התכוונת לאנגולר)
                לא יכולתי לנחש מזה בעיית CORS כי אדרבא, זו בעיה שישנה רק בדפדפן (בקוד, שרץ תחת דומיין זר לכתובת המבוקשת).

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

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

                yyyY תגובה 1 תגובה אחרונה
                3
                • yyyY מנותק
                  yyyY מנותק
                  yyy
                  כתב ב נערך לאחרונה על ידי yyy
                  #42

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

                  "cityname: %D7%99%D7%A8%D7%95%D7%A9%D7%9C%D7%99%D7%9D"

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

                  let httpOptions = {
                        headers: new HttpHeaders({
                          'Content-Type': 'application/json;charset=utf-8',
                          cityName: encodeURI(currCityName)
                        }),
                      };
                      return this.http.get<Neighborhood[]>(this.URL, httpOptions);
                  

                  ב- .net הקוד הוא כך

                  string currCity= Request.Headers.FirstOrDefault
                   (c=>c.Value== "cityName").ToString();
                      currCity =   System.Net.WebUtility.UrlDecode(currCity);
                  

                  אני מקבל ב-currCity את הסטרינג הבא "[,]" , לא ברור לי מה המשמעות של זה (מערך ריק?)

                  ניסיתי גם את הסינטקס הזה:

                  Request.Headers.FirstOrDefault (c=>c.Key== "cityName").Value;
                  

                  אבל אני מקבל null ב-currCity.

                  איך בדיוק מתפעלים את הפיענוח של ה-URI?
                  לחילופין יש דרך אחרת להעביר מידע עברי ב-headers?

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

                    @dovid כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

                    אלא שבצד לקוח יש לך בעיות "בירוקרטיות" עם הדפדפן שמסרב לאפשר לקוד לקבל את מבוקשו כי הוא רץ תחת דומיין אחר (במקרה שלך localhost).

                    לא הבנתי מה זה שונה מכל פניה לשרת. יש את הצד הפונה יהיה מי שלא יהיה, וברור שהוא פונה לגורם חיצוני שאינו הוא.
                    מה מיוחד במקרה שלי שבו localost פונה ל-gov.il?

                    כלומר אתה טענת שבדפדפן עובד (התכוונת לשורת הכתובת) ובשרת (התכוונת לאנגולר)

                    כרגיל טעיתי, וכרגיל אני כאן כדי ללמוד.

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

                      לא משתמשים בheaders כדי להעביר פרמטרים.
                      (למה? כי הכותרות הם מטה דטה על התקשורת ולא חלק ממנה עצמה).
                      בשביל פרמטרים משתמשים בqueryString (בדרך כלל בGET).

                      (אגב הגדרת 'Content-Type' בעוד אתה בכלל לא שולח JSON, יכול להיות שזה מה שמביא תוצאה משונה אבל בכל מקרה אל תנסה לפתור את זה ככה).

                      תכתוב ככה:

                      let httpOptions = { 
                            params: {cityName: currCityName}
                          };
                      return this.http.get<Neighborhood[]>(this.URL, httpOptions);
                      

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

                      public async Task<IActionResult> GetNeighborhoodByCity(string cityName)
                      

                      או לגשת לפרמטר בדרך שניסית לגשת לכותרת:

                        var city = Request.Params["cityName"];
                      

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

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

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

                      yyyY תגובה 1 תגובה אחרונה
                      4
                      • dovidD מנותק
                        dovidD מנותק
                        dovid ניהול
                        השיב לyyy ב נערך לאחרונה על ידי
                        #45

                        @yyy כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

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

                        למה הוא פונה לגורם חיצוני? בשונה ממתי שאתה מריץ אנגולר במחשב ואז יש localhost:XXX לדפדפן, וlocalhost:YYY לAPI, בייצור בד"כ הם באותו דומיין, ואם לא אז בסאב דומיין, ואם לא אז עם כותרות מיוחדות שהAPI מצרף לאפשר לכתובת הזרה הקבועה לגשת אליו גם מדפדפן.

                        אני מצרף פה טקסט שכתבתי בעבר להסביר מה זה בכלל CORS:

                        @dovid כתב בלא מצליח לשלוח headers באנגולר:

                        מה זה: הCORS זה הגנה ברמת דפדפן, על מי? על המשתמש. למשל, הדפדפן חושש, שאני בעל האתר תחומים שמתי בקוד האתר בקשת אינטרנט כזו שמנסה בשיטת מצליח לגשת ל50 הודעות אחרונות שקיבל הגולש התורן מgmail. אם אני הקוד יצליח אני אשלח את התוצאות לשרת שלי, שם אקרא בהנאה את כל הדואר נכנס של כל הגולשים באתר שלי. מה דעתך?
                        בא הדפדפן המודרני ומגן על המשתמש בו. הוא אומר לקוד שבאתר משהו נורא פשוט. אתה אמור לגשת לכתובות שמתחילות בtchumim.com בלבד, אוקי? אם אתה ניגש לכתובת gmail.com אנחנו נימנע מלהעביר לך את התשובה שתתקבל ויהיה לך שגיאת CORS והקוד ייכשל.
                        למה להימנע מלהעביר את התשובה ולא להימנע בכלל משליחת הבקשה? כי בתשובה נבדקת אפשרות שהאתר הזר (gmail) אישרו בעצמם גישה מדומיין tchumim למשל בגלל שזה אותו בעלים וכדומה. אז לכן מתקבלת התשובה, הדפדפן בודק אם יש אישור, ואם לא יש CORS.
                        איך פותרים אותו: נחזור בקצרה על הבעיה, אנחנו בקוד סקריפט שנמצא בדומיין א' רוצים לשלוח בקשות לדומיין ב. אם דומיין ב' בבעלותינו, אנחנו נוכל לשים שמה אישור לדומיין א, ע"י הוספת הידר מתאים בתשובות.
                        אבל במקרה שלך אני מנחש שהדומיין א' זה בעצם אנגולר ע"י הפקודה serve. במקרה כזה, החיים הרבה יותר קלים. אפשר פשוט להגדיר פרוקסי, שכל בקשה של דומיין ב בעצם תישלח לא ובא' יישלח בקשה בצד שרת (הcli שמריץ את אנגולר) לשרת ב, ואת התשובה הוא יחזיר עם הכותרות המתאימות שהכל יעבוד יופי. התצורה מתוארת פה: https://angular.io/guide/build#proxying-to-a-backend-server תפרט מה שני הדומיינים ואיך הם רצים ואני אשתדל לעזור לך להגדיר הכל נכון.

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

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

                        תגובה 1 תגובה אחרונה
                        4
                        • yyyY מנותק
                          yyyY מנותק
                          yyy
                          השיב לdovid ב נערך לאחרונה על ידי
                          #46

                          @dovid כתב בAPI רחובות לפי שכונות\ שכונות לפי ערים:

                          או לגשת לפרמטר בדרך שניסית לגשת לכותרת:

                            var city = Request.Params["cityName"];
                          

                          זה לא עובד (דוטנט 3, לא יודע מה בחדשים יותר)
                          מה שכן עובד זה:

                          Request.Query["cityName"].ToString();
                          
                          dovidD תגובה 1 תגובה אחרונה
                          2
                          • dovidD מנותק
                            dovidD מנותק
                            dovid ניהול
                            השיב לyyy ב נערך לאחרונה על ידי
                            #47

                            @yyy כתבתי מהשערה...

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

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

                            תגובה 1 תגובה אחרונה
                            1
                            • by6199B by6199 התייחס לנושא זה ב
                            • Y.Excel.AccessY Y.Excel.Access התייחס לנושא זה ב
                            • yyyY yyy התייחס לנושא זה ב
                            • yyyY yyy התייחס לנושא זה ב
                            • dovidD dovid התייחס לנושא זה ב

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

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

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