נפתר מדוע נוצרת השגיאה הזו?
-
@amp-Software-0 כתב במדוע נוצרת השגיאה הזו?:
@עידו
כן,
את ה token אפשר לשלוח גם ב Headerבהידר או בURL או שזה אותו דבר (כמדומני שלא, אבל אולי אני טועה)?
-
@עידו
זה לא אותו דבר, אבל אפשר לשלוח בשניהם -
@amp-Software-0 עכשיו שגיאה חדשה
responseStatus":"EXCEPTION",
"exceptionClass":"IllegalArgumentException",
"exceptionMessage":"what is required",
"nestedException":null,
"yemotAPIVersion":6 -
@עידו
שלח את הקוד המעודכן איתו אתה משתמש -
אני מקוה שזה הכל, השתדלתי לאסוף את כל הקוד הרלוונטי. (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# כמובן)
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 -
@אהרן-שובקס כן, זה הבנתי, השאלה למה...
-
@אהרן-שובקס למה בכלל צריך סיריליזציה בשביל ג'סון? הרי זה מחרוזות בסדר מסוים, מה הבעיה לעשות את זה ידנית
-
זה הג'סון שמתקבל:
{"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"}
-
בכל הפורום אין מישהו שיודע C#?
-
@עידו בניתי גם כן קוד ב-C# וקיבלתי את אותה השגיאה כאשר השתמשתי ב- HttpClient.PostAsync, כנראה שיש בעיה בסיראליזציה של ה-body, והטוקן לא מצליח להיות מתורגם כראוי.
למרות שנהוג להשתמש ב-POST לצורך יצירת משאבים (קבצים, נתנוים וכד'), כאן השתמשתי ב-HttpClient.GetAsync לצורך עקיפת הבעיה, וזה אכן הצליח ליצור קובץ לשלוחה הרצויה.
אגב, לצורך שימוש ב-API צריך לבצע 2 בקשות:
- הזדהות דרך מתודת קצה Login, לצורך קבלת ה-token.
- קריאה למתודת קצה המתאימה (שכאן היא 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!"); } } }
-
@soris1989 תודה
אני גם משתמש בGET בד"כ הבעיה היא שעכשיו אני צריך לשלוח כמות גדולה של מידע שבקשת GET רגילה לא מסתדרת איתה... לא ברור לי בכלל למה הPOST לא עובד.בעקרון לא צריך 2 בקשות, מספיקה בקשה אחת בפורמט token=number:pass וזה מספיק.
אגב, בדקתי את זה מול האתר jsonplaceholder והג'סון נראה תקין לגמרי. לכאורה זה אצל ימות המשיח.
-
@עידו "בעקרון לא צריך 2 בקשות, מספיקה בקשה אחת בפורמט token=number:pass וזה מספיק."
באמת? אם כך זה חוסך סתם בקשה מיותרת.יש תיעוד של זה בדוקומנטציה?
-
שימו לב!
ישנה דרך נוספת ליצירת טוקן ללא צורך בבקשת Login
כאשר שולחים כל פקודת API, לרשום בפרמטר token מספר מערכת : סיסמא (username:password)לדוגמה:
${url}<WebServiceName>?token=${username}:${password}
-
@עידו תודה רבה!!
-
@עידו החלטתי להגדיל ראש ובדקתי את העניין ע"י שליחת בקשת 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!"); }
-
@soris1989 עובד ב"ה
תודה רבה!
-
-
-
-