נפתר מדוע נוצרת השגיאה הזו?
-
@אהרן-שובקס למה בכלל צריך סיריליזציה בשביל ג'סון? הרי זה מחרוזות בסדר מסוים, מה הבעיה לעשות את זה ידנית
-
זה הג'סון שמתקבל:
{"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 עובד ב"ה
תודה רבה!
-
-
-
-