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

    נפתר מדוע נוצרת השגיאה הזו?

    פורום מפתחים API
    4
    24
    450
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • הגיבו כנושא
    התחברו בכדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • ע
      עידו @אהרן שובקס נערך לאחרונה על ידי

      @אהרן-שובקס

      אני מקוה שזה הכל, השתדלתי לאסוף את כל הקוד הרלוונטי. (C# כמובן)

      using System.Net.Http;
      using Newtonsoft.Json;
      using System.Net;
      using static System.Windows.Forms.VisualStyles.VisualStyleElement;
      using System.Runtime.Remoting.Contexts;
      using System.Security.Policy;
      using static System.Net.WebRequestMethods;
      
       static readonly HttpClient client = new HttpClient();
       private async void button1_Click1(object sender, EventArgs e)
       {
       string[] json = new string[3];
      
       var jsonContent1 = new
       {
           what = "ivr2:SaleProducts/sale_products_name.ini",
           contents = textBox1.Text.Replace("\r\n", "%0a")
       };
       json[0] = System.Text.Json.JsonSerializer.Serialize(jsonContent1);
       HttpContent content;
      
       for (int i = 0; i < json.Length; i++)
       {
           content = new StringContent(json[i], Encoding.UTF8, "application/json");
           string url = $"https://www.call2all.co.il/ym/api/UploadTextFile?token={numberTb.Text}:{passTb.Text}";
           try
           {
               // שליחת בקשת POST
               HttpResponseMessage responseJ = await client.PostAsync(url, content);
      
               // בדיקת מצב התגובה
               if (responseJ.IsSuccessStatusCode)
               {
                   // קריאת התוכן של התגובה
                   string responseContent = await responseJ.Content.ReadAsStringAsync();
                   textBox1.Text += $"{url} Response: {responseContent}";
               }
               else
               {
                   MessageBox.Show("הפעולה נכשלה", "שגיאה");
                   textBox1.Text += $"Error: {responseJ.StatusCode}";
                   return;
               }
           }
           catch (Exception ex)
           {
               Console.WriteLine($"Exception: {ex.Message}");
           }
       }
      }
      
      אהרן שובקס תגובה 1 תגובה אחרונה תגובה ציטוט 0
      • אהרן שובקס
        אהרן שובקס ניהול @עידו נערך לאחרונה על ידי אהרן שובקס

        @עידו כתב במדוע נוצרת השגיאה הזו?:

        @אהרן-שובקס

        אני מקוה שזה הכל, השתדלתי לאסוף את כל הקוד הרלוונטי. (C# כמובן)

        using System.Net.Http;
        using Newtonsoft.Json;
        using System.Net;
        using static System.Windows.Forms.VisualStyles.VisualStyleElement;
        using System.Runtime.Remoting.Contexts;
        using System.Security.Policy;
        using static System.Net.WebRequestMethods;
        
         static readonly HttpClient client = new HttpClient();
         private async void button1_Click1(object sender, EventArgs e)
         {
         string[] json = new string[3];
        
         var jsonContent1 = new
         {
             what = "ivr2:SaleProducts/sale_products_name.ini",
             contents = textBox1.Text.Replace("\r\n", "%0a")
         };
         json[0] = System.Text.Json.JsonSerializer.Serialize(jsonContent1);
         HttpContent content;
        
         for (int i = 0; i < json.Length; i++)
         {
             content = new StringContent(json[i], Encoding.UTF8, "application/json");
             string url = $"https://www.call2all.co.il/ym/api/UploadTextFile?token={numberTb.Text}:{passTb.Text}";
             try
             {
                 // שליחת בקשת POST
                 HttpResponseMessage responseJ = await client.PostAsync(url, content);
        
                 // בדיקת מצב התגובה
                 if (responseJ.IsSuccessStatusCode)
                 {
                     // קריאת התוכן של התגובה
                     string responseContent = await responseJ.Content.ReadAsStringAsync();
                     textBox1.Text += $"{url} Response: {responseContent}";
                 }
                 else
                 {
                     MessageBox.Show("הפעולה נכשלה", "שגיאה");
                     textBox1.Text += $"Error: {responseJ.StatusCode}";
                     return;
                 }
             }
             catch (Exception ex)
             {
                 Console.WriteLine($"Exception: {ex.Message}");
             }
         }
        }
        

        אני לא מבין בC#
        אבל כתוב שהוא לא מקבל שדה what

        ע 2 תגובות תגובה אחרונה תגובה ציטוט 1
        • ע
          עידו @אהרן שובקס נערך לאחרונה על ידי

          @אהרן-שובקס כן, זה הבנתי, השאלה למה...

          תגובה 1 תגובה אחרונה תגובה ציטוט 0
          • ע
            עידו @אהרן שובקס נערך לאחרונה על ידי

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

            תגובה 1 תגובה אחרונה תגובה ציטוט 0
            • ע
              עידו נערך לאחרונה על ידי

              זה הג'סון שמתקבל:

              {"what":"ivr2:SaleProducts/sale_products_category.ini","contents":"boy1.csv=001,002,003,004,005,006,%0aboy2.csv=007,008,009,010,011,012,013,014,015,016,017,018,%0aboy3.csv=019,020,021,022,023,024,025,026,027,028,029,030,031,032,033,034,035,036,037,038,039,%0aboy4.csv=040,041,042,043,044,045,046,047,048,049,050,051,052,053,054,055,056,057,058,%0aboy5.csv=059,060,061,062,063,064,065,066,067,068,069,070,071,072,073,074,075,076,077,078,%0aboy6.csv=079,080,081,082,083,084,085,086,087,088,089,090,091,092,093,094,095,096,097,098,099,100,%0aboy7.csv=101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,%0aboy8.csv=117,118,119,120,121,122,%0agirl1.csv=123,124,125,126,127,128,129,130,131,132,%0agirl2.csv=133,134,135,136,137,138,139,140,141,142,143,144,%0agirl3.csv=145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,%0agirl4.csv=160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,%0agirl5.csv=179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,%0agirl6.csv=199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,%0agirl7.csv=220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,%0agirl8.csv=243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,%0a"}
              
              
              תגובה 1 תגובה אחרונה תגובה ציטוט 0
              • ע
                עידו נערך לאחרונה על ידי

                בכל הפורום אין מישהו שיודע C#?

                S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                • S
                  soris1989 @עידו נערך לאחרונה על ידי soris1989

                  @עידו בניתי גם כן קוד ב-C# וקיבלתי את אותה השגיאה כאשר השתמשתי ב- HttpClient.PostAsync, כנראה שיש בעיה בסיראליזציה של ה-body, והטוקן לא מצליח להיות מתורגם כראוי.

                  למרות שנהוג להשתמש ב-POST לצורך יצירת משאבים (קבצים, נתנוים וכד'), כאן השתמשתי ב-HttpClient.GetAsync לצורך עקיפת הבעיה, וזה אכן הצליח ליצור קובץ לשלוחה הרצויה.

                  אגב, לצורך שימוש ב-API צריך לבצע 2 בקשות:

                  1. הזדהות דרך מתודת קצה Login, לצורך קבלת ה-token.
                  2. קריאה למתודת קצה המתאימה (שכאן היא UploadTextFile), תוך כדי השתלת ה-token ב-body או ב-header בהתאם לדוקומנטציה בקישור:
                    https://f2.freeivr.co.il/topic/55/api-גישת-מפתחים-למערכות/33?_=1739774721081

                  להלן הקוד:

                  using Newtonsoft.Json;
                  using Newtonsoft.Json.Linq;
                  using System;
                  using System.Net.Http;
                  using System.Text;
                  using System.Threading.Tasks;
                  
                  namespace YemotUploadTextFile
                  {
                      internal class Program
                      {
                          static void Main(string[] args)
                          {
                              UploadTextFileWithGet().GetAwaiter().GetResult();
                              Console.WriteLine("Done!");
                          }
                  
                  
                          static async Task UploadTextFileWithGet()
                          {
                              var username = "<username>";
                              var password = "<password>";
                  
                              var client = new HttpClient();
                  
                              try
                              {
                                  // login yemot system for getting token
                                  HttpResponseMessage responseJ = await client.GetAsync(
                                      $"https://www.call2all.co.il/ym/api/Login?username={username}&password={password}");
                  
                                  // בדיקת מצב התגובה
                                  if (responseJ.IsSuccessStatusCode)
                                  {
                                      // קריאת התוכן של התגובה
                                      string responseContent = await responseJ.Content.ReadAsStringAsync();
                                      Console.WriteLine($"Response: {responseContent}");
                  
                                      var responseObj = JsonConvert.DeserializeObject<JObject>(responseContent);
                  
                                      if (responseObj["responseStatus"].ToString() == "OK")
                                      {
                                          // send a get request to upload file on yemot server
                                          string token = responseObj["token"].ToString();
                                          string what = "ivr2:14/text_file.ini";
                                          string contents = "Some test message";
                  
                                          Console.WriteLine($"Response: {token}");
                  
                                          client = new HttpClient();
                                          var responseJ2 = await client.GetAsync($"https://www.call2all.co.il/ym/api/UploadTextFile?token={token}&what={what}&contents={contents}");
                                          // בדיקת מצב התגובה
                                          if (responseJ2.IsSuccessStatusCode)
                                          {
                                              // קריאת התוכן של התגובה
                                              var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
                                              Console.WriteLine($"Response: {responseContent2}");
                                          }
                                          else
                                          {
                                              Console.WriteLine($"Error: {responseJ2.StatusCode}");
                                              return;
                                          }
                                      }
                                      else
                                      {
                                          Console.WriteLine($"Error: {responseObj["message"]}");
                                          return;
                                      }
                  
                                  }
                                  else
                                  {
                                      Console.WriteLine($"Error: {responseJ.StatusCode}");
                                      return;
                                  }
                  
                  
                              }
                              catch (Exception ex)
                              {
                                  Console.WriteLine($"Exception: {ex.Message}");
                              }
                  
                              await Task.Delay(1000);
                              Console.WriteLine("Async work done!");
                          }
                      }
                  }
                  
                  
                  ע תגובה 1 תגובה אחרונה תגובה ציטוט 1
                  • ע
                    עידו @soris1989 נערך לאחרונה על ידי עידו

                    @soris1989 תודה
                    אני גם משתמש בGET בד"כ הבעיה היא שעכשיו אני צריך לשלוח כמות גדולה של מידע שבקשת GET רגילה לא מסתדרת איתה... לא ברור לי בכלל למה הPOST לא עובד.

                    בעקרון לא צריך 2 בקשות, מספיקה בקשה אחת בפורמט token=number:pass וזה מספיק.

                    אגב, בדקתי את זה מול האתר jsonplaceholder והג'סון נראה תקין לגמרי. לכאורה זה אצל ימות המשיח.

                    S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                    • S
                      soris1989 @עידו נערך לאחרונה על ידי

                      @עידו "בעקרון לא צריך 2 בקשות, מספיקה בקשה אחת בפורמט token=number:pass וזה מספיק."
                      באמת? אם כך זה חוסך סתם בקשה מיותרת.

                      יש תיעוד של זה בדוקומנטציה?

                      ע תגובה 1 תגובה אחרונה תגובה ציטוט 0
                      • ע
                        עידו @soris1989 נערך לאחרונה על ידי

                        @soris1989
                        בהחלט

                        שימו לב!
                        ישנה דרך נוספת ליצירת טוקן ללא צורך בבקשת Login
                        כאשר שולחים כל פקודת API, לרשום בפרמטר token מספר מערכת : סיסמא (username:password)

                        לדוגמה:

                        ${url}<WebServiceName>?token=${username}:${password}

                        S 2 תגובות תגובה אחרונה תגובה ציטוט 0
                        • S
                          soris1989 @עידו נערך לאחרונה על ידי

                          @עידו תודה רבה!!

                          תגובה 1 תגובה אחרונה תגובה ציטוט 0
                          • S
                            soris1989 @עידו נערך לאחרונה על ידי soris1989

                            @עידו החלטתי להגדיל ראש ובדקתי את העניין ע"י שליחת בקשת POST, בפורמט של x-url-encoded (במקום בפורמט של application/json), וזה עבד.

                            כנראה באמת יש בעיה בסיריאליזציה בפורמט JSON.

                            להלן הקוד:

                            static async Task UploadTextFileWithPost()
                            {
                                        try
                                        {
                                             var client = new HttpClient();
                            
                                            // Prepare key-value pairs
                                            var formData = new Dictionary<string, string>
                                            {
                                                { "token", $"{Username}:{Password}" },
                                                { "what", "ivr2:14/text_file.ini" },
                                                { "contents", "Some test message" }
                                            };
                            
                                            // Create FormUrlEncodedContent
                                            var content = new FormUrlEncodedContent(formData);
                            
                                            // Optional: Add headers (Content-Type is set automatically)
                                            client.DefaultRequestHeaders.Accept.Clear();
                                            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
                            
                                            var responseJ2 = await client.PostAsync("https://www.call2all.co.il/ym/api/UploadTextFile", content);
                            
                                            // בדיקת מצב התגובה
                                            if (responseJ2.IsSuccessStatusCode)
                                            {
                                                // קריאת התוכן של התגובה
                                                var responseContent2 = await responseJ2.Content.ReadAsStringAsync();
                                                Console.WriteLine($"Response: {responseContent2}");
                                            }
                                            else
                                            {
                                                Console.WriteLine($"Error: {responseJ2.StatusCode}");
                                                return;
                                            }
                                        }
                                        catch (Exception ex)
                                        {
                                            Console.WriteLine($"Exception: {ex.Message}");
                                        }
                            
                                        await Task.Delay(1000);
                                        Console.WriteLine("Async work done!");
                            }
                            
                            ע תגובה 1 תגובה אחרונה תגובה ציטוט 1
                            • ע
                              עידו @soris1989 נערך לאחרונה על ידי

                              @soris1989 עובד ב"ה

                              תודה רבה!

                              תגובה 1 תגובה אחרונה תגובה ציטוט 0
                              • הנושא סומן כשאלה  ע עידו 
                              • הנושא סומן כנפתר  ע עידו 
                              • הוזכר על-ידי  ע עידו 
                              • הוזכר על-ידי  ע עידו 
                              • פוסט ראשון
                                פוסט אחרון