DCSIMG
Web Service -> JSON -> JavaScript. קל פשוט ונהדר - שלמה גולדברג (הרב דוטנט)

שלמה גולדברג (הרב דוטנט)

מרצה בסלע ויועץ בעולם ה - net.

Web Service -> JSON -> JavaScript. קל פשוט ונהדר

 

מיום ליום אני מתעצבן פחות על ה java script, ואני מגלה עוד דברים נהדרים שאפשר לעשות איתו.
 
כאן אני רוצה להראות, עד כמה זה פשוט מ JavaScript לפנות ל Web Service, לקבל מידע ב JSON, ולעבוד איתו.
 
שלב ראשון, נכתוב WebService.
 
 

    1 public class Student

    2 {

    3     public string Name { get; set; }

    4     public string Address { get; set; }

    5     public string Phone { get; set; }

    6     public int Age { get; set; }

    7 }

 

 

    8     [WebService(Namespace = "http://tempuri.org/")]

    9     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

   10     [ToolboxItem(false)]

   11     [ScriptService]

   12     public class JsonWebService : WebService

   13     {

   14 

   15         [WebMethod]

   16         public Student[] GetAllStudent()

   17         {

   18             return new Student[]

   19             {

   20                 new Student(){ Name = "Shlomo",

   21                                Age = 24,

   22                                Phone = "123456",

   23                                Address = "Elad"},

   24 

   25                 new Student(){ Name = "Yossi",

   26                                Age = 23,

   27                                Phone = "543256",

   28                                Address = "Beni brak"},

   29 

   30                 new Student(){ Name = "Tomer",

   31                                Age = 30,

   32                                Phone = "0000000",

   33                                Address = "Tel Aviv"}

   34             };

   35         }

   36     }

   37 }

 
הגדרנו class כלשהו, ואנחנו מחזירים מערך שלו במתודה של web service.
 
כעת נכתוב מתודה ב JavaScript, שיודעת לפנות לשרת ולהחזיר JSON, (במחרוזת)
 
את הקוד הבא העתקתי (עם קצת שינויים) מכאן:
 
 

   38 function GetSynchronousJSONResponse(url, postData) {

   39     var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

   40 

   41     //false means synchronous

   42     xmlhttp.open("POST", url, false);

   43     xmlhttp.setRequestHeader("Content-Type",

   44             "application/json; charset=utf-8");

   45 

   46     xmlhttp.send(postData);

   47     var responseText = xmlhttp.responseText;

   48     return responseText;

   49 }

 
המתודה מקבלת url של web Service + web method, ו postData שזה פרמטרים עבור המתודה.
 
מייצרים אובייקט של xmlhttp,
 
מגדירים את כל ההגדרות, ומצפים לתשובה.
 
כעת נראה את הקריאה למתודה.
 

   50 function GetData() {

   51     var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';

   52     var result = GetSynchronousJSONResponse(url, null);

   53 

   54 }

 
 
במידה ונעשה alert למה שחוזר, נראה את הדבר הבא:
 
Json Alert
 
 
כעת מה שנשאר, זה להפוך את המחרוזת הזאת לאובייקט JSON, שאפשר לעבוד איתו.
 
נכתוב את הקוד הבא:
 
 

   55 function GetData() {

   56     var url = 'http://localhost/jsondemp/JsonWebService.asmx/GetAllStudent';

   57     var result = GetSynchronousJSONResponse(url, null);

   58     //alert(result);

   59     result = eval('(' + result + ')');

   60 

   61     for (var i = 0; i < result.d.length; i++) {

   62         var person = result.d[i];

   63 

   64         var name = person.Name;

   65         var phone = person.Phone;

   66 

   67 

   68     }

   69 }

 
 
כמו שאתם רואים ה eval מקמפל את המחרוזת לאובייקט שמכיל persons,
 
וכעת אנחנו יכולים לעבוד עם זה בקלות.

תוכן התגובה

Rotem Bloom כתב/ה:

רק שתדע ש-JAVASCRIPT באמת שפה חזקה ונחמדה ובאמת אפשר לעשות איתה דברים ממש נחמדים.

JSON הוא בהחלט אחד מהם, דרך נהדרת וחסכונית להעברת מידע בן לקוח לשרת.

ביי רתם

# March 6, 2009 9:55 PM

Avi Pinto כתב/ה:

אחלה פוסט,

אני אוהב JAVASCRIPT(תמיד אהבתי :-))

העדר תיעוד נורמלי ו IntelliSense בעורך + התנהגות ספציפית בדפדפנים שונים גרמו להרבה מתכנתים לסלוד ממנה.

רק הערה קטנה - שימוש ב eval לפרסוס של הנתונים החוזרים יכול לגרום לבעיות אבטחה - עדיף להשתמש בפונקציות מוכנות לפרסוס מחרוזות JSON

ב IE8 תהיה פונקציה כזו כבר במימוש בדפדפן (למרות שזה שוב יוצר בעיה של תאימות דפדפנים)

# March 7, 2009 10:28 AM

Shlomo כתב/ה:

הי אבי, אולי תכתוב לנו, איזה פונקציות מוכנות יש לנו.

# March 7, 2009 8:00 PM

Rotem Bloom כתב/ה:

היי שלמה,

אבי אכן צודק השימוש ב-EVAL של JAVASCRIPT אכן מסוכן ולא מומלץ.

אתה יכול ללכת אל:

http://www.json.org/

ולהוריד משם קובץ JS שיתן לך את היכולת להעביר STRING ל-OBJECT ולהיפך עם בדיקות אבטחה.

ביי רתם

# March 8, 2009 1:29 PM

Avi Pinto כתב/ה:

כרגע בעבודה אני משתמש ב ajaxPro שממיר לי אוטומטית את הערכים.

חשבתי שהוא משתמש בפונקצית parse כלשהי , בדקתי עכשיו, ומסתבר שגם הוא משתמש ב eval אבל בצורה הבאה:

r.json = responseText;

eval("r.value="+responseText+"*"+"/");

(תעתיק ל notepad ותיישר לשמאל - אי אפשר לקרוא את זה אחרת)

r זה האובייקט שחוזר מבקשת AJAX, יש לו מאפיין שמחזיק את ה JSON כטקסט רגיל, ויש לו מאפיין value שמחזיק את האובייקט שחזר.

אני מניח שביצוע ה eval בצורה שהוא עושה - ז"א תחימתו כערך שייכנס לתוך מאפיין + התוספת של סגירת ההערה (שאין לי מושג למה היא תורמת), הופכת אותו ליותר בטוח.

אבל לא הייתי סומך על זה

לגבי IE8 - תצפה בסרטון הבא

msdn.microsoft.com/.../dd483221.aspx

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

פורים שמח

(איזה כיף זה, כשה CAPTCHA מרימה את הראש המכוער שלה וחוטפת סקריפט שמוריד אותה חזרה אל האפלה)

# March 8, 2009 2:55 PM

Shlomo כתב/ה:

תודה לשניכם.

אני אבדוק את זה.

ואבי, זה אכן באמת כיף להתעלל ב CAPTCHA.

ותזקוף את זה לזכותך (שהתעצלת להגיב לי)

אז כולנו מודים לך. ושיהיה פורים שמח.

# March 8, 2009 3:09 PM

איתן כתב/ה:

היי כולם,

זו נראית כמו אחלה שיטה אבל כשאני עושה alert הוא לא מפרט לי את הערכים (?)

נתתי לאובייקט רק שם פרטי ושם משפחה, ובמקום מערך החזרתי אובייקט אחד בלבד..

ה ALERT חזיר לי ה את d: שמתאר איזה אובייקט, אבל הוא לא כותב לי את הערכים..

מן הסתם אחרי זה הוא גם לא נותן לי לפרק את האובייקט..

מישהו יודע מה הבעיה יכולה להיות?

# September 10, 2009 12:20 PM

Shlomo כתב/ה:

תסתכל ב - debugger מה מכיל ה - d

או שהוא מכיל מאפיינים  כלומר

d.name

או ש - d מכיל אובייקט כלשהו שמכיל את המאפיינים

# September 10, 2009 4:17 PM

שלמה גולדברג כתב/ה:

בהמשך לפוסט Web Service -&gt; JSON -&gt; JavaScript. קל פשוט ונהדר אני מדגים שם איך לפנות ל - WebSerive

# November 23, 2009 1:17 PM

שלמה גולדברג כתב/ה:

בהמשך ל - Web Service -&gt; JSON -&gt; JavaScript. קל פשוט ונהדר ו - שליחה של Complex Type ו - Array

# November 25, 2009 1:24 PM

ישי כתב/ה:

שלום לכולם ,

אני מקבל בחזרה הודעת שגיאה :

System.InvalidOperationException: Request format is invalid: application/json; charset=utf-8.

  at System.Web.Services.Protocols.HttpServerProtocol.ReadParameters()

  at System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequest()

לא מצאתי לזה פתרון , מישהו יודע ?

תודה.

# February 2, 2010 4:17 PM

שלמה גולדברג כתב/ה:

כתבתי כמה פוסטים על הפעלה של WebService מתוך JavScript ומקבלים תוצאות ב - JSON. זה עובד מעולה בתוך אותו

# March 5, 2010 11:01 AM
שלח תגובה

(שדה חובה)  

(שדה חובה)  

(אופציונלי)

(שדה חובה) 

Please add 1 and 3 and type the answer here:


Enter the numbers above: