web api with json
-
אני בדיוק עובד כעת על פרוייקט שמתממשק לAPI אחר.
השאלה היא מאד תלויה מתי את אמורה לקבל את הנתונים ובאיזה אופן.
יש אפשרות לעשות זאת דרך c#, כלומר שאת פונה מהקונטרולר לשרת האחר מקבלת ממנו את הנתונים ומציגה אותם בHTML.
אם זה צריך להיות דינמי, את יכולה לשלוח בקשה לקונטרולר שלך מהJS, הוא שולח בקשה לAPI מעבד את המידע החוזר, ושולח לתצוגה רק את מה שעבר את הסינון.
במקרה כזה הקוד הוא אותו קוד כמו כל שליחת בקשה לשרת מהJS.
והנה דוגמא לקוד צד שרת בC#:public JsonResult AutoCompleteSearch() { string url = "";//כאן מכניסים את הדומיין המרוחק //יצירת אובייקט של שאילתא HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); //סוג הפניה: GET או POST request.Method = "GET"; //יצירת אובייקט ומילויו בנתונים שצריכים להשלח לשרת //המרת האובייקט לJSON //כתיבת האוביקט לתוך השאילתא using (var sw = new StreamWriter(request.GetRequestStream())) { // sw.Write(כאן צריך להכניס את הג'יסון ); } //אובייקט לתשובה var response = (HttpWebResponse)request.GetResponse(); //קריאת התשובה using (var sr = new StreamReader(response.GetResponseStream())) { var result = sr.ReadToEnd(); return Json(result, JsonRequestBehavior.AllowGet); } }
כמובן, ישנה אפשרות לשלוח את הבקשה ישירות מהJS לאתר המרוחק, ואת התשובה להציג אצלך. אני לא הצלחתי לעשות זאת.
אבל בעקרון כיון שהדפדפן חוסם ייבוא של אובייקטים משרתים אחרים(מטעמי אבטחה) לכן צריך להשתמש בפורמט JSONP שהוא בעצם עוקף את זה, עייני כאן בהרחבה (בקצרה, הוא עוטף את אובייקט הJSON בפונקציה, ומקבל מהשרת פונקציה. כיון שאע"פ שא"א לייבא אובייקטים משרת אחר, אך אפשר לקבל סקריפטים משרת אחר.. לכן צריך שהשרת לא יחזיר אובייקט אלא יעטוף אותו בפונקציה ואז ישלח אותו חזרה).אם זה דינמי אז צריך לעבוד עם AJAX כדי לא לרענן את הדף כל פעם מחדש..
הקוד הוא ממש אותו קוד שמשמש אותנו לשלוח בקשות לשרת שלנו, רק שבכתובת הURL כותבים את הכתובת של הAPI. ואם משתמשים בJSONP אז צריך לשנות את ההגדרות שיתאימו לו, כמו שמוסבר בקישור.בהצלחה!
מקווה שעזרתי. בכל אופן, זה מה שאני יודע ולא מתוך ניסיון מרובה... אז אם למישהו יש עצות אחרות - אשמח לשמוע.פורסם במקור בפורום CODE613 ב16/11/2015 09:36 (+02:00)
-
אברהם אתה כריש!
רק הערה, הקוד שהבאת עובד טוב? כי לדעתי המתודה json (בשורה 24) מקבלת אובייקט וממירה אותו לjson. ואילו אתה נותן לה סטרינג מה שיביא את התוצאה של אובייקט עם ערך טקסטואלי יחיד.
אני חושב שצריך לשנות את סוג המתודה שתחזיר ActionResult במקום JsonResult ואז להחזיר עם המתודה Content:
return Content(result , "application/json");וכמובן זה רק כשהשרת הוא צינור בין שרת אחר ללקוח - וזה אכן לא הגיוני ברוב המקרים. אבל במידה וצריך מוניפולציה כמו שאמרת אז הקוד שהבאת הוא מדוייק רק חסר השלב של פיענוח הjson - כנראה בגלל שהשארת פתוח בהתאם לצרכים.
פורסם במקור בפורום CODE613 ב16/11/2015 11:49 (+02:00)
-
@דוד ל.ט.
אברהם אתה כריש!
רק הערה, הקוד שהבאת עובד טוב? כי לדעתי המתודה json (בשורה 24) מקבלת אובייקט וממירה אותו לjson. ואילו אתה נותן לה סטרינג מה שיביא את התוצאה של אובייקט עם ערך טקסטואלי יחיד.תודה על המחמאות
אכן כן, אצלי זה עובד מעולה!! כיון שהשרת המרוחק שולח אובייקט JSON, אז זה לא סטרינג רגיל, אלא סטרינג של JSON..
בתוך אובייקט הJSON שנוצר, יש כמה מאפיינים ובמאפיין DATA נמצאים הנתונים של האובייקט אותם אני מחלץ ע"י מתודה של JS באופן דינמי.
בהתחלה חשבתי שאפשר לוותר על השימוש ב - StreamReader כיון שגם ככה השרת שולח JSON מוכן. אולם, בלי השימוש בזה לא הצלחתי למצוא את הJSON. כנראה שרק ככה הוא קורא את הנתונים מהשרת.
@דוד ל.ט.וכמובן זה רק כשהשרת הוא צינור בין שרת אחר ללקוח - וזה אכן לא הגיוני ברוב המקרים. אבל במידה וצריך מוניפולציה כמו שאמרת אז הקוד שהבאת הוא מדוייק רק חסר השלב של פיענוח הjson - כנראה בגלל שהשארת פתוח בהתאם לצרכים.
אני אכן משתמש בזה רק בתור צינור, כיון שהJSONP לא עבד לי בהתחלה. אמנם, אח"כ הבנתי שאני צריך לגרום שהשרת המרוחק יחזיר את הJSON עטוף בפונקציה כדי שזה יעבוד, אבל עדיין לא שיניתי את זה.
אולם, כמו שכתבת זה המקום גם לפיענוח הJSON וכו' כל אחד לפי צרכיו.פורסם במקור בפורום CODE613 ב16/11/2015 14:43 (+02:00)
-
@דוד ל.ט.
רק הערה, הקוד שהבאת עובד טוב? כי לדעתי המתודה json (בשורה 24) מקבלת אובייקט וממירה אותו לjson. ואילו אתה נותן לה סטרינג מה שיביא את התוצאה של אובייקט עם ערך טקסטואלי יחיד.
אכן כן, אצלי זה עובד מעולה!! כיון שהשרת המרוחק שולח אובייקט JSON, אז זה לא סטרינג רגיל, אלא סטרינג של JSON..
צדקת ממני :lol: :lol:
אכן בקוד הJS אני מבצע המרה לאובייקט JSON ולכן זה עבד לי טוב..success: function (returnJson) { var returnData = JSON.parse(returnJson);
פורסם במקור בפורום CODE613 ב16/11/2015 21:59 (+02:00)
-
ומה אמורים לכתוב בקטעים המודגשים?
אין לי שום אובייקט להמיר אני רוצה לקבל אובייקט מסוג JSON אני לא שולחת שום אובייקט אבל[u:3h2mtbn7]//המרת האובייקט לJSON
//כתיבת האוביקט לתוך השאילתא[/u:3h2mtbn7]
using (var sw = new StreamWriter(request.GetRequestStream()))
{
[u:3h2mtbn7] // sw.Write(כאן צריך להכניס את הג'יסון );[/u:3h2mtbn7]
}פורסם במקור בפורום CODE613 ב17/11/2015 10:28 (+02:00)
-
אם את רק מקבלת ולא שולחת כלום - אז את יכולה למחוק את כל זה.
כמו כן, עדיף לעשות כמו שדוד הציע, ולכן תשני את הפונקציה שתחזיר ActionResult ולא JsonResult
ובסוף במקום לכתוב:return Json(result, JsonRequestBehavior.AllowGet);
עדיף לעשות:
return Content(result , "application/json");
כמו כן, אם את כן צריכה לשלוח כל מיני פרמטרים לשרת שם, אז אם את שולחת POST אז תעשי איך שכתבתי למעלה.
אך אם זה GET, אז פשוט מוסיפים את הנתונים מיד בסיום הURL, לאחר הסימן ?.
בהצלחה!פורסם במקור בפורום CODE613 ב17/11/2015 10:36 (+02:00)
-
כן ככה בדיוק עשיתי ובאמת קיבלת את אובייקט הJSON המבוקש
הבעיה שלי עכשיו איך מתעסקים עם הדבר הזה בC#
אין לי מושג איך ניגשים להיררכיה הזו
יש למישהו דוגמא לריצה או גישה לתוכן של JSON בC#?
כי אני רוצה למלא איזה VM ואותו לשלוח לקליינטפורסם במקור בפורום CODE613 ב17/11/2015 10:50 (+02:00)
-
בC# מתעסקים עם json עם המחלקה json.net. היא זמינה במנהל החבילות של nuget (קליק ימני על הפרוייקט/סולושן > Manage Nuget Package...).
כעת השאלה מה את רוצה לעשות וזה בעצם מה שכדאי תמיד לפרט במקסימום בשאלה.
למשל אם: את יודעת מראש (בעת כתיבת הקוד) את המבנה של הjson?
במקרה כזה הכי נוח זה ליצור מחלקת C# מקבילה למבנה הJSON. ואז סריאליזציה: http://www.newtonsoft.com/json/help/html/DeserializeObject.htmאבל אם המבנה דינמי כל פעם משהו אחר (או שהוא קבוע רק שאינך יודעת אותו מראש) אז מוכרחים לעבוד ע"י ניתוח התוכן. הנה מצב של עיבוד json לא ספציפי:
http://www.newtonsoft.com/json/help/html/ReadJsonWithJsonTextReader.htmפורסם במקור בפורום CODE613 ב17/11/2015 14:53 (+02:00)
-
מצאתי איזשהי דרך לעבוד עם הJSON כי זה אובייקט ממש מורכב ולא שייך ליצור לו אובייקט מתאים
using (var sr = new StreamReader(response.GetResponseStream())) { var result = sr.ReadToEnd(); var obj = JObject.Parse(result); for (int i = 0; i < 10; i++) { vm.Images.Add(new InsetegramModels() { ImagePath = obj.GetValue("data")[i]["images"]["standard_resolution"]["url"].ToString(), Caption = obj.GetValue("data")[i]["caption"]["text"].ToString(), CreatedDate = GeneralUtil.UnixTimeStampToDateTime(Convert.ToDouble(obj.GetValue("data")[0]["created_time"].ToString())), Likes = obj.GetValue("data")[i]["likes"]["count"].ToString(), }); } }
האם זה נחשב דרך קצת פרימיטיבית ולא חכמה?
פורסם במקור בפורום CODE613 ב18/11/2015 09:52 (+02:00)
-
כעיקרון כשעובדים עם פרוייקט API לא צריך לדעת כמעט כלום על ג'ייסון אם עובדים עם התפיסה של דוט נט, הוא יודע לקחת אובייקטים ולהפוך אותם לג'ייסון לבד, וכן לקבל ג'ייסון ולהמיר אותו לאובייקט כבר בפרמטר של הקונטרולר, זה די מיותר להתחרבש עם מחלקות של ג'ייסון.
פורסם במקור בפורום CODE613 ב18/11/2015 23:40 (+02:00)