הטמעת ה-Charts Data Data Protocol (V0.6) של Chart Tools

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

תוכן עניינים

קהל

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

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

אם ברצונך ליצור תצוגה חזותית או להשתמש בה, אין צורך לקרוא את הדף הזה.

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

הערה:Google לא מעניקה תמיכה או תמיכה רשמית במקורות נתונים שאינם של Google, שתומכים בפרוטוקול מקור הנתונים של כלי התרשימים.

סקירה כללית

תוכלו להשתמש בפרוטוקול מקור הנתונים של כלי התרשימים כדי להיות ספק מקור נתונים לתרשימים משלכם, או לתרשימים אחרים. מקור נתונים לכלים לתרשימים חושף כתובת URL שנקראת כתובת URL של מקור נתונים, שאליה תרשים יכול לשלוח בקשות HTTP GET. בתגובה, מקור הנתונים מחזיר נתונים בפורמט תקין שבהם התרשים יכול לשמש לעיבוד הגרפיקה שבדף. פרוטוקול ה-Request-Response הזה נקרא Google Visualization API פרוטוקול חוטי.

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

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

  • ניתן להשתמש באחת מספריות העזרה הבאות כדי לטפל בבקשה ובתגובה וליצור את DataTable להחזרה. אם משתמשים באחת מהספריות האלה, צריך לכתוב רק את הקוד הדרוש כדי שהנתונים יהיו זמינים לספרייה בצורת טבלה.
  • כתוב מקור נתונים משלך מההתחלה על ידי טיפול בבקשה, יצירת DataTable ושליחת התגובה.

איך זה עובד:

  1. מקור הנתונים חושף כתובת URL שנקראת כתובת URL של מקור נתונים, שאליה תרשימים שולחים בקשת HTTP GET.
  2. הלקוח שולח בקשת GET ב-HTTP עם פרמטרים שמתארים באיזה פורמט להשתמש עבור נתונים שהוחזרו, מחרוזת שאילתה אופציונלית ופרמטרים אופציונליים מותאמים אישית.
  3. מקור הנתונים מקבל ומנתח את הבקשה, כפי שמתואר ב פורמט הבקשה.
  4. מקור הנתונים מכין את הנתונים בפורמט המבוקש. לרוב, מדובר בטבלת JSON. הפורמטים של התגובות נכללים בקטע פורמט התגובות. מקור הנתונים יכול לתמוך בשפת השאילתה של Vision API, המציינת סינון, מיון ומניפולציות אחרות על נתונים.
  5. מקור הנתונים יוצר תגובת HTTP שכוללת את הנתונים הסידוריים ואת הפרמטרים האחרים של התגובה, ושולח אותם חזרה ללקוח כפי שמתואר בפורמט התגובה.

הערה: כל הפרמטרים והערכים הקבועים במחרוזת שצוינו במסמך זה לבקשות ולתשובות (כגון responseHandler ו-"אישור") הם אותיות קטנות ותלויות אותיות רישיות.

דרישות מינימליות

אלו הדרישות המינימליות שישמשו כמקור נתונים של כלי תרשים:

  • מקור הנתונים צריך לקבל בקשות HTTP GET ולהיות זמין ללקוחות שלכם.
  • הפרוטוקול יכול לשנות ולתמוך בסכימת גרסאות (הגרסה הנוכחית היא 0.6), כך שמקור הנתונים צריך לתמוך בבקשות באמצעות הגרסאות הקודמות וגם בגרסה הנוכחית. מומלץ לנסות לתמוך בגרסאות חדשות ברגע שהן מתפרסמות, כדי למנוע פריצה ללקוחות שמשדרגים לגרסה העדכנית ביותר במהירות.
  • כישלון במקרה שנכסים לא ידועים נשלחים כחלק מהבקשה. הסיבה לכך היא שגרסאות חדשות יכולות להשיק נכסים חדשים שעדיין לא ידעת עליהם.
  • נתחו רק נכסים שאתם מצפים לקבל. אומנם גרסאות חדשות עשויות לכלול נכסים חדשים, אבל אנחנו לא מאשרים את השימוש במחרוזת הבקשה במלואה. כדי להגן על עצמך מפני התקפות זדוניות, כדאי לנתח בקפידה את המאפיינים שציפית להשתמש בהם ולהשתמש בהם בלבד.
  • הקפידו לתעד את הדרישות של מקור הנתונים אם אתם לא מקודדים את תרשימי הלקוחות בעצמכם. דוגמאות למסמכים כאלה:
    • כל פרמטר מותאם אישית שאתם מקבלים,
    • אם ניתן לנתח את שפת השאילתות של Google Visualization API, וגם
    • מהו סוג הנתונים שמחזירים, והמבנה של הנתונים האלה (מה שהשורות והעמודות מייצגות ותוויות שמסומנות).
  • יש לנקוט אמצעי זהירות רגילים בכל הנוגע לאתר שמקבל בקשות מלקוחות לא ידועים. ניתן לתמוך באופן סביר ב-MD5, ב-hash ובמנגנוני אבטחה אחרים בפרמטרים שלך כדי לאמת בקשות או לסייע באבטחה מפני מתקפות זדוניות, והלקוחות צריכים להיות מודעים לדרישות שלך ולהגיב להן. עם זאת, חשוב לתעד את כל הדרישות בצורה נכונה, אם לא מקודדים את התרשימים בעצמכם. אפשר לקרוא בהמשך על שיקולי אבטחה.
  • כל מחרוזות הבקשה והתגובה צריכות להיות מקודדות בקידוד UTF-8.
  • פורמט התגובה החשוב ביותר הוא JSON. חשוב להטמיע JSON, כי זהו הפורמט שבו משתמשים רוב התרשימים. אפשר להוסיף סוגים אחרים של תשובות בשלב מאוחר יותר.
  • לא חייבים לתמוך בשפה של שאילתת ה-API להצגה חזותית, אבל היא הופכת את מקור הנתונים לשימושי יותר עבור הלקוחות.
  • לא חובה לתמוך בבקשות מכל סוג ומכל תרשים, ואפשר גם לתמוך בפרמטרים מותאמים אישית בתרשימים בהתאמה אישית. אבל צריך להחזיר את התגובות בפורמט הרגיל שבהמשך.

שיקולי אבטחה

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

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

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

כדי לוודא שבקשה מגיעה באמת מהדומיין שלך, ולא מדומיין חיצוני (או מדפדפן בתוך הדומיין שנמצא במתקפת XSRF):

  • יש לאמת את הנוכחות של כותרת "X-DataSource-Auth" בבקשה. הכותרת מוגדרת על ידי Google Visualization API. אין צורך לבדוק את התוכן של הכותרת הזו רק לוודא שהיא קיימת. אם אתם משתמשים בספריית מקורות הנתונים של Google Chart , הספרייה יכולה להתאים לכם.
  • משתמשים באימות קובצי cookie כדי לאמת את הלקוח. אין דרך ידועה להזרקת כותרות מותאמות אישית לבקשה בין דומיינים, תוך שמירה על קובצי cookie לאימות.
  • יש לוודא שה-JavaScript לא יפעל כאשר הוא נכלל בתג <script src>. כדי לעשות זאת, מוסיפים את המחרוזת JSON לפני )]} ואז מוסיפים שורה חדשה. יש להסיר את הקידומת מהלקוח. ב-XmlHttpRequest, זה אפשרי רק כשהבקשה הגיעה מאותו דומיין.

פורמט הבקשה

לקוח שולח בקשת GET של HTTP עם מספר פרמטרים, כולל רכיבים מותאמים אישית, מחרוזת שאילתה אופציונלית, חתימה ורכיבים אחרים. האחריות היא רק לנתח את הפרמטרים שמתוארים בקטע הזה ולהיזהר לא לטפל בגורמים אחרים כדי להימנע מהתקפות זדוניות.

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

כמה בקשות לדוגמה (אפשר לראות דוגמאות נוספות לבקשות ולתשובות בסוף המסמך הזה בקטע דוגמאות):

הערה: לפני שליחת מחרוזות ה-URL הבאות, יש לסמן אותן בתו בריחה (escape) אחרי המחרוזות הבאות בקטע דוגמאות.

Basic request, no parameters:
http://www.example.com/mydatasource

Request with the tqx parameter that contains two properties:
http://www.example.com/mydatasource?tqx=reqId:0;sig:4641982796834063168

Request with a query string:
http://www.example.com/mydatasource?tq=limit 1

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

פרמטר
נדרש בבקשה?
מהו מקור הנתונים?
תיאור
tq, טק טי
לא
לא

שאילתה שכתובה בשפת השאילתות של Google Visualization API ומציינת איך לסנן, למיין או לשנות את הנתונים שהוחזרו. אין צורך לצטט את המחרוזת.

דוגמה: http://www.example.com/mydatasource?tq=select Col1

tqx, טקס
לא
כן

קבוצה של צמדי מפתח/ערך המופרדים בנקודתיים עבור פרמטרים סטנדרטיים או פרמטרים מותאמים אישית. הערכים מופרדים באמצעות נקודה-פסיק (;). לפניכם רשימה של הפרמטרים הרגילים שמוגדרים על ידי פרוטוקול ההמחשה:

  • reqId - [חובה בבקשה. מקור הנתונים צריך לטפל] מזהה מספרי לבקשה הזו. כך משתמשים כדי לשלוח ללקוח מספר בקשות לפני שמתקבל תגובה, הוא יכול לזהות את התשובה עם הבקשה המתאימה. יש לשלוח את הערך הזה בחזרה בתגובה.
  • version - [אופציונלי בבקשה. מקור הנתונים צריך לטפל] מספר הגרסה של פרוטוקול Google Visualization. הגרסה הנוכחית היא 0.6. אם היא לא נשלחה, צריך להניח את הגרסה העדכנית ביותר.
  • sig - [אופציונלי בבקשה; אופציונלי למקור הנתונים לטיפול] גיבוב (hash) של DataTable שנשלח ללקוח הזה בכל הבקשות הקודמות למקור הנתונים הזה. זוהי אופטימיזציה שמטרתה למנוע שליחת נתונים זהים ללקוח פעמיים. לקבלת מידע על אופן השימוש, כדאי לעיין באופטימיזציה של הבקשה בהמשך.
  • out – [אופציונלי בבקשה. מקור הנתונים צריך לטפל] מחרוזת שמתארת את הפורמט של הנתונים המוחזרות. זה יכול להיות כל אחד מהערכים הבאים:
    • json - [ערך ברירת המחדל] מחרוזת של תגובת JSON (כמתואר בהמשך).
    • html – טבלת HTML בסיסית עם שורות ועמודות. אם זה משמש, הדבר היחיד שצריך להחזיר הוא טבלת HTML עם הנתונים; הדבר שימושי לניפוי באגים, כפי שמתואר בקטע פורמט תגובה בהמשך.
    • csv - ערכים מופרדים בפסיקים. אם נעשה שימוש בערך הזה, הדבר היחיד שהוחזר הוא מחרוזת של נתוני CSV. אפשר לבקש שם מותאם אישית לקובץ בכותרות התגובות על ידי ציון פרמטר outFileName.
    • tsv-excel – דומה לקוד csv, אבל בשימוש בכרטיסיות במקום בפסיקים וכל הנתונים מקודדים בפורמט utf-16.
    שימו לב: סוג הנתונים היחיד שתרשים שנוצר ב-Google Visualization API יבקש מדי פעם הוא json. לקבלת מידע על כל סוג, אפשר לעיין בקטע פורמט תגובה בהמשך.
  • responseHandler – [אופציונלי בתוך הבקשה. חובה לטפל במקור הנתונים] שם המחרוזת של פונקציית הטיפול ב-JavaScript בדף הלקוח, והוא ייקרא יחד עם התגובה. אם הוא לא כלול בבקשה, הערך הוא google.visualization.Query.setResponse. התגובה תישלח חזרה כחלק מהתשובה, בקטע פורמט תגובה שבהמשך.
  • outFileName – [אופציונלי בתוך בקשה; אופציונלי אצל מקורות נתונים לטיפול] אם מציינים out:csv או out:tsv-excel, אפשר לבקש את שם הקובץ כפי שמצוין כאן. לדוגמה: outFileName=results.csv

דוגמה: tqx=version:0.6;reqId:1;sig:5277771;out:json; responseHandler:myQueryHandler

tqrt, טירקט
לא
לא

שמור: התעלמות מהפרמטר הזה. השיטה שבה נעשה שימוש לשליחת השאילתה.

פורמט תגובה

פורמט התשובה תלוי בפרמטר out של הבקשה, שמציין את סוג התגובה הצפויה. בקטעים הבאים מוסבר איך לענות לכל סוג של בקשה:

  • JSON – החזרת תגובת JSON שכוללת את הנתונים באובייקט JavaScript, שניתן להעביר ישירות לבנאי DataTable כדי לאכלס אותו. זהו סוג הבקשה הנפוץ ביותר, והחשוב ביותר להטמיע אותו כראוי.
  • CSV – מחזירה רשימת ערכים שטוחה המופרדת בפסיקים, שיש לטפל בה בדפדפן.
  • TSV – מחזירה רשימת ערכים מופרדים בטאבים, שיטופלו על ידי הדפדפן.
  • HTML – מחזירה טבלת HTML שתוצג על ידי הדפדפן.

אפשר להשתמש בספריית מקור נתוני ההמחשה של Google (ג'אווה) או בספריית המילון החזותית כדי ליצור בשבילך את הפורמטים האלה.

פורמט של תגובת JSON

פורמט התגובה המוגדר כברירת מחדל הוא JSON אם הבקשה כוללת כותרת מסוג "X-DataSource-Auth", ואם לא, JSONP. חשוב לשים לב שהלקוח תרשים Google תומך בפועל בגרסה ששונתה של JSON ו-JSONP. אם משתמשים בספריות המסייעות של Java או Python, הם יפרסמו את הקוד המתאים בשבילך. אם מנתחים את התגובות באופן ידני, יש לעיין בשינויים ב-JSON בהמשך.

אם בחרת לאכוף בקשות באותו דומיין, עליך לאמת את הנוכחות של הכותרת 'X-DataSource-Auth' בבקשה ולהשתמש בקובצי cookie של הרשאה.

זהו פורמט התגובה היחיד שצוין על ידי השיטה של Google Visualization API google.visualization.Query.send() . דוגמאות של בקשות ותגובות של JSON מוצגות בסוף הדף בקטע דוגמאות. אפשר להשתמש בספריות העזרה של Java או של Python כדי ליצור בשבילך את מחרוזת התגובה הזו.

פורמט התגובה הזה הוא אובייקט JSON בקידוד UTF-8 (אובייקט שמוקף בסוגריים מסולסלים { } עם כל נכס מופרד באמצעות פסיק) שכולל את המאפיינים בטבלה שבהמשך (הנתונים מוקצים לנכס table). יש להקיף את אובייקט JSON בתוך ערך הפרמטר responseHandler בתוך הבקשה. כלומר, אם הערך responseHandler של הבקשה הוא "myHandler", עליכם להחזיר מחרוזת כזאת (רק נכס אחד מוצג למטרות קיצור):

"myHandler({status:ok, ...})"

אם הבקשה לא כוללת ערך של responseHandler, ערך ברירת המחדל הוא "google.visualization.Query.setResponse", ולכן עליך להחזיר מחרוזת דומה לזו (רק נכס אחד מוצג לציון קיצור):

"google.visualization.Query.setResponse({status:ok, ...})"

אלו הם האנשים הנכללים באובייקטים של תגובות:

מאפיין (property)
נדרש?
תיאור
גרסה
לא

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

דוגמה: version=0.6

מזהה בקשה
כן*
מספר מחרוזת שמציין את מזהה הבקשה עבור הלקוח. אם זו הייתה הבקשה, יש להחזיר את אותו הערך. לפרטים נוספים אפשר לעיין בreqIdקטע בקשת.

* אם הפרמטר הזה לא צוין בבקשה, אין צורך להגדיר אותו בתשובה.
סטטוס
כן

מחרוזת המתארת את ההצלחה או הכשל של הפעולה. חייב להיות רק אחד מהערכים הבאים:

  • ok - בקשה שבוצעה בהצלחה. חובה לכלול טבלה בנכס table.
  • warning - הצלחת, אבל יש בעיות. חובה לכלול טבלה בנכס table.
  • error - הייתה בעיה. אם מחזירים את הערך הזה, אין להחזיר את table וצריך להחזיר את errors.

דוגמה: status:'warning'

אזהרות
רק אם status=warning

מערך של אובייקט אחד או יותר, שכל אחד מהם מתאר בעיה לא חמורה. חובה אם status=warning, אסור אחרת. לכל אובייקט יש את מאפייני המחרוזת הבאים (החזר ערך אחד בלבד לכל נכס):

  • reason - [חובה] תיאור של מילה אחת באזהרה. בפרוטוקול מוגדרים הערכים הבאים, אבל אתם יכולים להגדיר ערכים משלכם, אם אתם צריכים (אבל הלקוח לא יעבד ערכים מותאמים אישית בשום צורה מיוחדת). יכול להיות לך רק ערך אחד (reason):
    • data_truncated - ב-DataTable שהוחזרו הוסרו כמה שורות בגלל שהמשתמש כלל מחרוזת שאילתה שקצרה את רשימת התוצאות, או שמקור הנתונים לא רצה להחזיר תוצאות מלאות מסיבה כלשהי.
    • other – אזהרה כללית שלא צוינה.
  • message - [אופציונלי] מחרוזת מצוטטת קצרה המסבירה את הבעיה, וייתכן שתשמש ככותרת של תיבת התראה. זה יכול להיות מוצג למשתמש. HTML אינו נתמך.
  • detailed_message - [אופציונלי] הודעת טקסט מצוטטת הכוללת הסבר על הבעיה ופתרונות אפשריים. ה-HTML היחיד שנתמך הוא הרכיב <a> עם מאפיין אחד של href. יש תמיכה בקידוד Unicode. זה עשוי להיות מוצג למשתמש.

דוגמה: warnings:[{reason:'data_truncated',message:'Retrieved data was truncated'}]

שגיאות
חובה אם status=error

מערך של אובייקט אחד או יותר, שמתארים כל שגיאה. חובה אם status=error, אסור. הוא דומה לערך warnings. חשוב לשים לב שהשגיאה not_modified היא שגיאה, אבל למעשה אינה שגיאה עבור הלקוח.

במערך יש את מחרוזות המחרוזת הבאות (החזר ערך אחד בלבד לכל חבר):

  • reason - [חובה] זהה ל-warnings.reason, אבל הערכים הבאים מוגדרים:
    • not_modified - הנתונים לא השתנו מאז הבקשה האחרונה. אם זו הסיבה לשגיאה, אין להזין ערך עבור table.
    • user_not_authenticated - אם מקור הנתונים מחייב אימות והוא לא בוצע, צריך לציין את הערך הזה. לאחר מכן הלקוח יקבל התראה עם הערך message.
    • unknown_data_source_id
    • access_denied
    • unsupported_query_operation
    • invalid_query
    • invalid_request
    • internal_error
    • not_supported
    • illegal_formatting_patterns
    • other - שגיאה כללית שאינה מוגדרת.
  • message - [אופציונלי] כמו warnings.message. הערה: ייתכן שמשתמש זדוני ישתמש במחרוזת נתונים מפורטת כאמצעי לגישה אל נתונים לא מורשים, או אפילו לצורך שימוש בנתונים כדי לתקוף את הנתונים או את האתר שלך. אם מאחסנים נתונים שאמורים להיות מאובטחים או מעבדים שאילתות של משתמשים באופן ישיר, כדאי לא להחזיר הודעת שגיאה מפורטת שעשויה לספק מידע לתוקף. במקום זאת, צריך לשלוח הודעה כללית, כמו "מחרוזת שאילתה שגויה".
  • detailed_message - [אופציונלי] כמו warnings.detailed_message. מומלץ לקרוא את האזהרה כדי לקבל מידע מפורט מדי לגבי message.

דוגמה: status:'error',errors:[{reason:'not_modified',message:'Data not modified'}]

Sig
לא

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

דוגמה: sig:'5982206968295329967'

טבלה
לא

אובייקט DataTable בסימון מילולי של JavaScript, עם הנתונים שלך. בקטע 'קובץ עזר מקושר' מופיעים פרטים על הפורמט של האובייקט הזה. הנה דוגמה לטבלת נתונים פשוטה:

{cols:[{id:'Col1',label:'',type:'number'}],
 rows:[{c:[{v:1.0,f:'1'}]},
       {c:[{v:2.0,f:'2'}]},
       {c:[{v:3.0,f:'3'}]},
       {c:[{v:1.0,f:'1'}]}
      ]
} 

יש לכלול את הנכס table רק אם status=ok או status=warning. אם לא מחזירים נתונים, אין לכלול את הנכס הזה (כלומר, אין להחזיר את הנכס עם ערך מחרוזת ריק).

דוגמה: ראו דוגמאות בהמשך.

 

נדרש JSON מחמיר

ספריות העזרה של Google וכל השאילתות שנשלחות אל Google מחזירות JSON/JSONP מחמיר. אם אין לך צורך לנתח את הקוד שמוחזר, אין שום בעיה. במקרה כזה, אפשר להשתמש ב-JSON.parse() כדי להמיר את מחרוזת ה-JSON לאובייקט JavaScript. הבדל אחד באופן העיבוד של JSON על ידי ה-API הוא, שלמרות שה-JSON לא תומך בערכי תאריך JavaScript (לדוגמה, "תאריך חדש(2008,1,28,0,31,26)"; ה-API כן תומך בייצוג חוקי של תאריכים במחרוזת כמחרוזת בפורמט הבא:Date(year, month, day[,hour, minute, second[, millisecond]]) כאשר כל מה שמתרחש בסוף היום הוא אופציונלי, וגם החודשים מבוססים על אפס.

 

אופטימיזציה של תגובות JSON

אם לקוח שולח שתי בקשות, והנתונים לא השתנו בין בקשות, הגיוני לא לשלוח את הנתונים מחדש; הפעולה הזו תגרום לבזבוז רוחב פס. כדי לייעל את הבקשות, הפרוטוקול תומך במטמון הנתונים בלקוח ובשליחת אות בתגובה אם הנתונים לא השתנו מאז הבקשה האחרונה. כך זה עובד:

  1. הלקוח שולח בקשה למקור הנתונים.
  2. מקור הנתונים יוצר DataTable וגם גיבוב (hash) של האובייקט DataTable, ומחזיר את שניהם בתגובה (הגיבוב מוחזר בפרמטר tqx.sig). לקוח Google Visualization API שומר במטמון את הערך DataTable ואת הערך sig.
  3. הלקוח שולח בקשה נוספת לנתונים, כולל הערך tqx.sig השמור במטמון.
  4. מקור הנתונים יכול להגיב באחת משתי דרכים:
    • אם הנתונים השתנו מהבקשה הקודמת, מקור הנתונים ישלח שוב את הגיבוב (hash) החדש של DataTable ואת הערך החדש של sig.
    • אם הנתונים לא השתנו מהבקשה הקודמת, מקור הנתונים ישלח חזרה את status=error, reason=not_modified, sig=old_sig_value.
  5. בכל מקרה, הדף שמארח את התרשים מקבל תגובה מוצלחת, ויכול לאחזר את ה-DataTable על ידי התקשרות QueryResponse.getDataTable(). אם הנתונים זהים, הם יהיו גרסת המטמון של הטבלה.

חשוב לשים לב שאפשרות זו פועלת רק בבקשות JSON מתרשימים שנוצרו ב-Google Visualization API.

פורמט תגובה ל-CSV

אם הבקשה מציינת out:csv, התגובה לא תכלול מטא-נתונים, אלא רק ייצוג CSV של הנתונים. טבלת CSV היא בדרך כלל רשימה מופרדת בפסיקים, שבה כל שורת נתונים היא רשימת ערכים המופרדים בפסיקים, שמסתיימת בתו חדש של UNIX (\n). הערכים של כל תא צריכים להיות זהים בכל עמודה. השורה הראשונה כוללת את תוויות העמודות. הנה דוגמה לטבלה עם שלוש עמודות ב-3 שורות:

A, B, C
1.0, "yes", true
2.0, "no", false
3.0, "maybe", true

ה-CSV לא מצוין על ידי הפרוטוקול הזה. מקור הנתונים אחראי על ההגדרה של קובץ ה-CSV. עם זאת, פורמט נפוץ הוא קבוצה של ערכים המופרדים באמצעות פסיקים (ללא רווחים בין השורות), ושורה חדשה (\n) בסוף כל שורה. כשדפדפן מקבל תשובה לקובץ CSV, הוא עשוי לשאול את המשתמש באיזו אפליקציה להשתמש כדי לפתוח את המחרוזת, או פשוט לעבד אותה על המסך. ספריות הקוד הפתוח Java ו-Python מספקות שיטה להמרת DataTable למחרוזת CSV.

אם הבקשה כוללת חבר outFileName בפרמטר tqx , עליך לכלול את שם הקובץ שצוין בכותרות התגובה.

האובייקט google.visualization.Query לא תומך בבקשה לתגובת CSV. אם לקוח רוצה לבקש קובץ CSV, אפשר להטמיע גאדג'ט של סרגל הכלים להצגה חזותית בדף שלכם, או שהוא יכול להשתמש בקוד מותאם אישית כדי ליצור את הבקשה, או לספק קישור שמגדיר את המאפיין out:csv של tqx באופן מפורש, כמו בדוגמה הבאה בכתובת ה-URL של הבקשה:

בקשה

http://www.example.com/mydatasource?tqx=reqId:1;out:csv

תשובה

Label 1,Label2\n1,a\n2,b\n3,c\n4,d

פורמט תגובה ל-TSV

אם הבקשה מציינת out:tsv-excel, התגובה לא תכלול מטא-נתונים, אלא רק ייצוג מופרד בטאבים של הנתונים, עם קידוד utf-16 . אם הבקשה כוללת חבר outFileName בפרמטר tqx , עליך לכלול את שם הקובץ שצוין בכותרות התגובה.

פורמט תגובה ב-HTML

אם הבקשה מציינת out:html, התגובה צריכה להיות דף HTML שמגדיר טבלת HTML עם הנתונים. פעולה זו שימושית לניפוי באגים בקוד, כי הדפדפן עשוי לעבד את התוצאה ישירות בפורמט קריא. לא ניתן לשלוח שאילתה בתגובת HTML באמצעות האובייקט google.visualization.Query. צריך ליצור שאילתה לתגובת HTML באמצעות קוד מותאם אישית, או להקליד כתובת URL דומה לזו בדפדפן.

בקשה

http://www.example.com/mydatasource?tqx=reqId:1;out:html

תשובה

<html><body><table border='1' cellpadding='2' cellspacing='0'><tr style='font-weight: bold; background-color: #aaa;'><td>label 1</td><td>label 2</td></tr><tr bgcolor='#f0f0f0'><td align='right'>1</td><td>a</td></tr><tr bgcolor='#ffffff'><td align='right'>2</td><td>b</td></tr><tr bgcolor='#f0f0f0'><td align='right'>3</td><td>c</td></tr><tr bgcolor='#ffffff'><td align='right'>4</td><td>d</td></tr></table></body></html>

דוגמאות

ריכזנו כאן כמה בקשות ותגובות לדוגמה. חשוב לשים לב שהבקשות לא מקודדות בתווי בריחה. לרוב הפעולה הזו מתבצעת על ידי הדפדפן או האובייקט google.visualization.Query.

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

Request:
http://www.example.com/mydatasource

Response
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'ok',sig:'5982206968295329967',table:{cols:[{id:'Col1',label:'',type:'number'},{id:'Col2',label:'',type:'number'},{id:'Col3',label:'',type:'number'}],rows:[{c:[{v:1.0,f:'1'},{v:2.0,f:'2'},{v:3.0,f:'3'}]},{c:[{v:2.0,f:'2'},{v:3.0,f:'3'},{v:4.0,f:'4'}]},{c:[{v:3.0,f:'3'},{v:4.0,f:'4'},{v:5.0,f:'5'}]},{c:[{v:1.0,f:'1'},{v:2.0,f:'2'},{v:3.0,f:'3'}]}]}});

בקשה פשוטה עם handler של תגובה: מחזירה טבלה של שלוש עמודות עם שלושה סוגי נתונים.

Request:
http://www.example.com/mydatasource?tqx=responseHandler:myHandlerFunction

Response
myHandlerFunction({version:'0.6',reqId:'0',status:'ok',sig:'4641982796834063168',table:{cols:[{id:'A',label:'NEW A',type:'string'},{id:'B',label:'B-label',type:'number'},{id:'C',label:'C-label',type:'datetime'}],rows:[{c:[{v:'a'},{v:1.0,f:'1'},{v:new Date(2008,1,28,0,31,26),f:'2/28/08 12:31 AM'}]},{c:[{v:'b'},{v:2.0,f:'2'},{v:new Date(2008,2,30,0,31,26),f:'3/30/08 12:31 AM'}]},{c:[{v:'c'},{v:3.0,f:'3'},{v:new Date(2008,3,30,0,31,26),f:'4/30/08 12:31 AM'}]}]}});

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

Request:
http://www.example.com/mydatasource?tq=select Col1

Response:
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'ok',sig:'6099996038638149313',table:{cols:[{id:'Col1',label:'',type:'number'}],rows:[{c:[{v:1.0,f:'1'}]},{c:[{v:2.0,f:'2'}]},{c:[{v:3.0,f:'3'}]},{c:[{v:1.0,f:'1'}]}]}});

שגיאה בנתונים שלא שונו: דוגמה לשגיאה not_modified.

Request:
http://www.example.com/mydatasource?tqx=reqId:0;sig:4641982796834063168

Response:
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'error',errors:[{reason:'not_modified',message:'Data not modified'}]});

אזהרה לגבי חיתוך נתונים: דוגמה לאזהרה של data_truncated. שימו לב שהבקשה עדיין מחזירה נתונים.

Request:
http://www.example.com/mydatasource?tq=limit 1

Response:
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'warning',warnings:[{reason:'data_truncated',message:'Retrieved data was truncated'}],sig:'1928724788649668508',table:{cols:[{id:'A',label:'NEW A',type:'string'},{id:'B',label:'B-label',type:'number'},{id:'C',label:'C-label',type:'datetime'}],rows:[{c:[{v:'a'},{v:1.0,f:'1'},{v:new Date(2008,1,28,0,31,26),f:'2/28/08 12:31 AM'}]}]}});

שגיאת 'גישה נדחתה': דוגמה לשגיאה access_denied.

Request:
http://www.example.com/mydatasource

Response:
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'error',errors:[{reason:'access_denied',message:'Access denied',detailed_message:'Access Denied'}]});

מחרוזת שאילתה לא חוקית: דוגמה לבקשה עם מחרוזת שאילתה לא חוקית. חשוב לשים לב שההודעה המפורטת היא הודעה כללית ולא הודעת השגיאה בפועל.

Request:
http://www.example.com/mydatasource?tq=select A

Response:
google.visualization.Query.setResponse({version:'0.6',reqId:'0',status:'error',errors:[{reason:'invalid_query',message:'Invalid query',detailed_message:'Bad query string.'}]});

כלי פיתוח

  • ספריית מקור הנתונים של Java (מ-Google) - מטפלת בבקשה ובתגובה, יוצרת את טבלת התגובות מהנתונים שאתם נותנים לה ומטמיעה את שפת השאילתות של SQL בכלי Google Chart.
  • ספריית מקורות Python (מ-Google) – יוצרת טבלת תגובות שיוצרת את התחביר של התגובה. לא מטפלים בניתוח הבקשה או בהטמעה של שפת השאילתות של SQL בכלי Google Chart.
  • MC-Google_Visualization (צד שלישי) – זו ספרייה בצד השרת בפרוטוקול PHP שאפשר להשתמש בה כדי להטמיע מקור נתונים למסדי נתונים של Chart עבור מנועי MySQL, SQLite ו-PostgreSQL באמצעות PDO.
  • bortosky-google-visualization (צד שלישי) – זו ספרייה של משאבים שיעזרו לך ליצור טבלת נתונים של Google Visualization API למשתמשי .NET.
  • GV Streamer (צד שלישי) – GV Streamer הוא כלי בצד השרת, שיכול להמיר נתונים ממקורות שונים לתגובות חוקיות של שאילתות בתרשימים של Google. סטרימר מסוג GV תומך בכמה שפות (לדוגמה, PHP, Java, .NET) ומספר מקורות גולמיים (לדוגמה, MySql).
  • TracGViz (צד שלישי) – TracGViz הוא כלי חינמי בקוד פתוח, שמספק רכיבים כדי ש-Trac יוכל להשתמש בגאדג'טים של תרשים וגם להטמיע נתונים שמנוהלים על ידי Trac כמקור נתונים של Google Chart Tools.
  • vis-table (צד שלישי) – ספרייה שמטמיעה מקור נתונים של Google Chart Tools ב-PHP. הוא כולל שלושה חלקים עיקריים. הטמעה של טבלת הנתונים עצמה, מנתח שפת השאילתות ורכיבי העיצוב.
  • הטמעת מקור נתונים של Google ב-Oracle PL/SQL (צד שלישי) – חבילת Oracle PL/SQL שמאפשרת איסוף נתונים ממסד הנתונים של Oracle לשרת ישירות ממסד הנתונים. למעשה, ניתן להשתמש בכל שאילתה ב-Oracle כמקור נתונים של Google Chart Tools (החבילה תחזיר קובץ JSON עם הנתונים). הוא כולל תמיכה כמעט מלאה בשפת השאילתות של Google.