Diagrammtools-Datenquellenprotokoll implementieren (V0.6)

Auf dieser Seite wird beschrieben, wie Sie einen Dienst implementieren, der das Diagrammtools-Datenquellenprotokoll unterstützt, um Daten mithilfe der Abfrageklasse für Diagramme freizugeben.

Inhalt

Zielgruppe

Diese Seite richtet sich in erster Linie an Entwickler, die ihre eigene Datenquelle ohne die Hilfe der Chart Tools-Datenquellenbibliothek erstellen. Wenn Sie diese oder eine andere Hilfsbibliothek verwenden, lesen Sie zuerst die Dokumentation der Bibliothek.

Diese Seite ist auch für Leser gedacht, die das Wire-Protokoll für die Kommunikation zwischen einer Clientvisualisierung und einer Datenquelle verstehen möchten.

Wenn Sie eine Visualisierung erstellen oder verwenden, müssen Sie diese Seite nicht lesen.

Zum Lesen dieses Dokuments sollten Sie die grundlegende Syntax von JSON- und HTTP-Anfragen kennen. Außerdem sollten Sie verstehen, wie Diagramme aus Nutzersicht funktionieren.

Hinweis: Google unterstützt oder unterstützt keine Datenquellen, die nicht von Google stammen und das Diagrammtools-Datenquellenprotokoll unterstützen.

Übersicht

Sie können das Diagrammtools-Datenquellenprotokoll implementieren, um ein Datenquellenanbieter für eigene oder andere Diagramme zu werden. Eine Chart Tools-Datenquelle enthält eine URL, die Datenquellen-URL genannt wird, an die ein Diagramm HTTP-GET-Anfragen senden kann. Daraufhin gibt die Datenquelle korrekt formatierte Daten zurück, mit denen das Diagramm auf der Seite gerendert werden kann. Dieses Anfrage-Antwort-Protokoll wird als Kabel-Protokoll der Google Visualization API bezeichnet.

Die von einer Datenquelle bereitgestellten Daten können aus verschiedenen Ressourcen extrahiert werden, z. B. aus einer Datei oder Datenbank. Die einzige Einschränkung besteht darin, dass Sie die Daten als zweidimensionale Tabelle mit typisierten Spalten formatieren können.

Als Chart Tools-Datenquelle müssen Sie eine Anfrage in einem bestimmten Format parsen und eine Antwort in einem bestimmten Format zurückgeben. Dazu gibt es zwei Möglichkeiten:

  • Verwenden Sie eine der folgenden Hilfsbibliotheken, um die Anfrage und Antwort zu verarbeiten, und erstellen Sie die DataTable, die zurückgegeben werden soll. Wenn Sie eine dieser Bibliotheken verwenden, müssen Sie nur den Code schreiben, der für die Bereitstellung Ihrer Daten in Form einer Tabelle in der Bibliothek erforderlich ist.
    • Java-Datenquellenbibliothek – verarbeitet die Anfrage und die Antwort, erstellt die Antworttabelle aus den von Ihnen bereitgestellten Daten und implementiert die SQL-Abfragesprache Google Chart Tools.
    • Python-Datenquellenbibliothek – Erstellt eine Antworttabelle, um die Antwortsyntax zu generieren. Kann keine Anfragen analysieren oder die SQL-Abfragesprache Google Chart Tools implementieren

      ODER

  • Eigene Datenquelle neu schreiben: Erstellen Sie eine DataTable, um die Anfrage zu verarbeiten und die Antwort zu senden.

Funktionsweise:

  1. Die Datenquelle enthält eine URL, die Datenquellen-URL, an die Diagramme eine HTTP-GET-Anfrage senden.
  2. Der Client stellt eine HTTP GET-Anfrage mit Parametern, die beschreiben, welches Format für zurückgegebene Daten verwendet werden soll, einen optionalen Abfragestring und optionale benutzerdefinierte Parameter.
  3. Die Datenquelle empfängt und parst die Anfrage, wie unter Anfrageformat beschrieben.
  4. Die Datenquelle bereitet die Daten in dem angeforderten Format vor. In der Regel ist dies eine JSON-Tabelle. Antwortformate werden im Abschnitt Antwortformat behandelt. Die Datenquelle unterstützt optional die Abfragesprache der Visualization API, mit der Filter, Sortierung und andere Datenmanipulationen angegeben werden.
  5. Die Datenquelle erstellt eine HTTP-Antwort, die die serialisierten Daten und andere Antwortparameter enthält, und sendet sie an den Client zurück, wie unter Antwortformat beschrieben.

Hinweis: Alle Parameter und Stringkonstanten, die in diesem Dokument für Anfragen und Antworten aufgeführt sind (z. B. responseHandler und „ok“), werden kleingeschrieben. Dabei wird die Groß- und Kleinschreibung berücksichtigt.

Mindestanforderungen

Folgende Mindestanforderungen müssen erfüllt sein, damit sie als Chart Tools-Datenquelle verwendet werden können:

  • Die Datenquelle sollte HTTP-GET-Anfragen akzeptieren und für Ihre Clients verfügbar sein.
  • Das Protokoll kann sich ändern und ein Versionsschema unterstützen (die aktuelle Version ist 0.6). Ihre Datenquelle sollte daher Anfragen mit früheren und aktuellen Versionen unterstützen. Sie sollten neue Versionen ab ihrer Veröffentlichung unterstützen, um zu vermeiden, dass Clients, die ein Upgrade auf die neueste Version ausführen, schnell aktualisiert werden.
  • Nicht schlagen, wenn im Rahmen der Anfrage unbekannte Attribute gesendet werden. Der Grund hierfür ist, dass neue Versionen unter Umständen neue Attribute umfassen können, die Sie nicht kennen.
  • Parsen Sie nur Properties, die Sie erwarten. Obwohl neue Versionen möglicherweise neue Attribute einführen, akzeptieren und verwenden Sie nicht den gesamten Anfragestring. Um sich vor böswilligen Angriffen zu schützen, sollten Sie nur die erwarteten Attribute sorgfältig parsen und verwenden.
  • Dokumentieren Sie die Anforderungen an die Datenquelle sorgfältig, wenn Sie die Clientdiagramme nicht selbst codieren. Dazu gehört auch die Dokumentation der folgenden Informationen:
    • Zulässige benutzerdefinierte Parameter
    • Gibt an, ob Sie die Abfragesprache der Google Visualization API parsen können und
    • Welche Art von Daten Sie zurückgeben und welche Struktur diese Daten haben (was die Zeilen und Spalten darstellen und welche Labels sie haben).
  • Ergreifen Sie alle standardmäßigen Sicherheitsvorkehrungen für eine Website, die Anfragen von unbekannten Clients akzeptiert. Sie können MD5, Hashing und andere Sicherheitsmechanismen in Ihren Parametern angemessen unterstützen, um Anfragen zu authentifizieren oder vor böswilligen Angriffen zu schützen. Außerdem sollten Sie davon ausgehen, dass Clients Ihre Anforderungen kennen und darauf reagieren. Achten Sie jedoch darauf, alle Anforderungen gut zu dokumentieren, wenn Sie die Diagramme nicht selbst codieren. Weitere Informationen finden Sie unten im Abschnitt Hinweise zur Sicherheit.
  • Alle Anfrage- und Antwortstrings sollten UTF-8-codiert sein.
  • Das wichtigste Antwortformat ist JSON. Implementieren Sie zuerst JSON, da dies das von den meisten Diagrammen verwendete Format ist. Fügen Sie anschließend andere Antworttypen hinzu.
  • Sie müssen die Abfragesprache der Visualization API nicht unterstützen, Ihre Datenquelle wird dadurch jedoch für Kunden nützlicher.
  • Sie müssen nicht alle Diagrammtypen und auch benutzerdefinierte Parameter für benutzerdefinierte Diagramme unterstützen. Sie sollten Antworten jedoch im unten beschriebenen Standardformat zurückgeben.

Überlegungen zur Sicherheit

Beim Entwerfen der Datenquelle müssen Sie berücksichtigen, wie sicher Ihre Daten sein müssen. Sie können eine Vielzahl von Sicherheitsschemas für Ihre Website verwenden, vom einfachen Passwortzugriff bis zur sicheren Cookieauthentifizierung.

XSSI-Angriffe (Cross-Site Script Inclusion) sind ein potenzielles Risiko für Diagramme. Ein Nutzer ruft unter Umständen eine Seite mit einem schädlichen Skript auf, mit der Abfragen der Datenquellen-URLs gestartet werden. Dazu werden die Anmeldedaten des aktuellen Nutzers verwendet. Wenn sich der Nutzer nicht von einer Website abgemeldet hat, wird das Skript als aktueller Nutzer authentifiziert und hat auf dieser Website Berechtigungen. Wenn Sie ein <script src>-Tag verwenden, kann das schädliche Skript die Datenquelle aufnehmen, ähnlich wie bei JSONP.

Als zusätzliche Sicherheitsstufe können Sie Anfragen auf diejenigen beschränken, die aus derselben Domain wie Ihre Datenquelle stammen. Dadurch wird die Sichtbarkeit Ihrer Datenquelle erheblich eingeschränkt. Wenn Sie jedoch sehr sensible Daten haben, auf die von außerhalb Ihrer Domain nicht zugegriffen werden soll, sollten Sie diese berücksichtigen. Eine Datenquelle, die nur Anfragen von derselben Domain zulässt, wird als eingeschränkte Datenquelle bezeichnet – im Gegensatz zu einer uneingeschränkten Datenquelle, die Abfragen von jeder beliebigen Domain akzeptiert. Im Folgenden finden Sie einige Details zum Implementieren einer eingeschränkten Datenquelle:

So sorgst du dafür, dass eine Anfrage wirklich von deiner Domain und nicht von einer externen Domain oder einem Browser innerhalb der Domain stammt, die einem XSRF-Angriff ausgesetzt ist:

  • Prüfen Sie, ob in der Anfrage der Header „X-DataSource-Auth“ vorhanden ist. Dieser Header wird von der Google Visualization API definiert. Sie müssen den Inhalt des Headers nicht prüfen, sondern nur prüfen, ob er dort vorhanden ist. Wenn Sie die Datenquellenbibliothek der Google Chart Tools verwenden, können Sie dies von der Bibliothek erledigen lassen.
  • Verwenden Sie die Cookie-Authentifizierung, um den Client zu authentifizieren. Es gibt keine Möglichkeit, benutzerdefinierte Header in eine domainübergreifende Anfrage einzufügen, während weiterhin Authentifizierungscookies verwendet werden.
  • Die Ausführung des JavaScript-Codes mit einem <script src>-Tag ist eher unwahrscheinlich. Stellen Sie dazu Ihrer JSON-Antwort das Präfix ]]} voran, gefolgt von einem Zeilenumbruch. Entfernen Sie in Ihrem Client das Präfix aus der Antwort. Bei XmlHttpRequest ist dies nur möglich, wenn die Anfrage von derselben Domain stammt.

Anfrageformat

Ein Client sendet eine HTTP-GET-Anfrage mit mehreren Parametern, einschließlich benutzerdefinierter Elemente, optionaler Abfragestrings, Signaturen und anderer Elemente. Sie sind nur dafür verantwortlich, die in diesem Abschnitt beschriebenen Parameter zu parsen. Achten Sie darauf, nicht mit anderen zu umgehen, um böswillige Angriffe zu vermeiden.

Sie sollten Standardwerte für optionale Parameter (Standard- und benutzerdefinierte Parameter) verwenden und alle Standardwerte in der Websitedokumentation dokumentieren.

Im Folgenden finden Sie einige Beispielanfragen. Weitere Beispiele für Anfragen und Antworten finden Sie am Ende dieses Dokuments unter Beispiele:

Hinweis: Die folgenden Anfragestrings sowie die Strings im Bereich Beispiele sollten vor dem Senden mit URL-Escape-Zeichen versehen werden.

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

Hier sehen Sie eine Liste aller Standardparameter im Anfragestring. Bei Parameternamen (z. B. „Version“) und konstanten Stringwerten (z. B. „ok“, „warning“ und „not_modify“) muss die Groß- und Kleinschreibung beachtet werden. In der Tabelle wird auch beschrieben, ob der Parameter gesendet werden muss und, falls gesendet, ob er verarbeitet werden muss.

Parameter
In Anfrage erforderlich?
Datenquelle muss verarbeitet werden?
Beschreibung
TQ
Nein
Nein

Eine Abfrage, die in der Abfragesprache der Google Visualization API geschrieben ist und angibt, wie die zurückgegebenen Daten gefiltert, sortiert oder anderweitig bearbeitet werden sollen. Der String muss nicht in Anführungszeichen gesetzt werden.

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

TQX
Nein
Ja

Eine Reihe von durch Doppelpunkt getrennten Schlüssel/Wert-Paaren für Standard- oder benutzerdefinierte Parameter. Paare werden durch Semikolons getrennt. Hier ist eine Liste der Standardparameter, die vom Visualisierungsprotokoll definiert werden:

  • reqId – [in Anfrage erforderlich; Datenquelle muss verarbeitet werden] Eine numerische Kennung für diese Anfrage. Wenn ein Client mehrere Anfragen sendet, bevor eine Antwort eingeht, kann die Datenquelle die Antwort mit der richtigen Anfrage identifizieren. Senden Sie diesen Wert in der Antwort zurück.
  • version – [Optional in Anfrage; Datenquelle muss verarbeitet werden] Die Versionsnummer des Google Visualization-Protokolls. Die aktuelle Version ist 0.6. Wenn nicht gesendet, nehmen Sie die neueste Version an.
  • sig – [optional in Anfrage; optional für die Verarbeitung der Datenquelle] ein Hashwert von DataTable, der in vorherigen Anfragen an diese Datenquelle an diesen Client gesendet wurde Dies ist eine Optimierung, die verhindert, dass zweimal identische Daten an einen Client gesendet werden. Informationen zur Verwendung finden Sie unten unter Anfrage optimieren.
  • out: [optional in der Anfrage; Datenquelle muss verarbeitet werden] Ein String zur Beschreibung des Formats der zurückgegebenen Daten Folgende Werte sind möglich:
    • json – [Standardwert] Ein JSON-Antwortstring (siehe unten).
    • html: einfache HTML-Tabelle mit Zeilen und Spalten In diesem Fall sollte nur eine HTML-Tabelle mit den Daten zurückgegeben werden. Dies ist für die Fehlerbehebung hilfreich, wie unten im Abschnitt Antwortformat beschrieben.
    • CSV – durch Kommas getrennte Werte. In diesem Fall wird nur ein CSV-Datenstring zurückgegeben. Sie können einen benutzerdefinierten Namen für die Datei in den Antwortheadern anfordern, indem Sie einen outFileName-Parameter angeben.
    • tsv-excel – Ähnlich wie csv, aber mithilfe von Tabs anstelle von Kommas. Alle Daten sind utf-16-codiert.
    Der einzige Datentyp, den ein auf der Google Visualization API basierendes Diagramm erstellen wird, ist JSON. Weitere Informationen zu den einzelnen Typen finden Sie unter Antwortformat.
  • responseHandler: [Optional in Anfrage; Datenquelle muss verarbeiten] Der Stringname der JavaScript-Verarbeitungsfunktion auf der Clientseite, die mit der Antwort aufgerufen wird. Wenn er nicht in der Anfrage enthalten ist, lautet der Wert „google.visualization.Query.setResponse“. Dies wird als Teil der Antwort zurückgeschickt. Weitere Informationen finden Sie unten im Antwortformat.
  • outFileName: [Optional in Anfrage; optional zur Verarbeitung der Datenquelle] Wenn Sie out:csv oder out:tsv-excel angeben, können Sie optional den hier angegebenen Dateinamen anfordern. Beispiel:outFileName=results.csv.

Beispiel: tqx=version:0.6;reqId:1;sig:5277771;out:json; responseHandler:myQueryHandler

TQRT
Nein
Nein

Reserviert: Diesen Parameter ignorieren. Die Methode, mit der die Abfrage gesendet wurde.

Antwortformat

Das Format der Antwort hängt vom Parameter out der Anfrage ab, der den Typ der erwarteten Antwort angibt. In den folgenden Abschnitten erfahren Sie, wie Sie auf die einzelnen Anfragetypen reagieren:

  • JSON: Gibt eine JSON-Antwort mit den Daten eines JavaScript-Objekts zurück, das direkt an einen DataTable-Konstruktor übergeben werden kann, um es auszufüllen. Dies ist der bei Weitem am häufigsten verwendete Anfragetyp und am wichtigsten für eine korrekte Implementierung.
  • CSV: Gibt eine einfache, durch Kommas getrennte Werteliste zurück, die vom Browser verarbeitet wird.
  • TSV: Gibt eine tabulatorgetrennte Wertliste zurück, die vom Browser verarbeitet wird.
  • HTML: Gibt eine HTML-Tabelle zurück, die vom Browser gerendert werden soll.

Sie können diese Ausgabeformate in der Google Visualization Data Source Library (Java) oder der Visualisierungs-Python-Bibliothek generieren.

JSON-Antwortformat

Das Standardantwortformat ist JSON, wenn die Anfrage einen „X-DataSource-Auth“-Header enthält, ansonsten JSONP. Der Google-Diagrammclient unterstützt tatsächlich eine modifizierte Version von JSON und JSONP. Wenn Sie die Hilfsbibliotheken Java oder Python verwenden, wird der richtige Code für Sie ausgegeben. Wenn Sie Antworten manuell parsen, lesen Sie unten den Abschnitt JSON-Änderungen.

Wenn Sie Anfragen für dieselbe Domain erzwingen, sollten Sie prüfen, ob der Header „X-DataSource-Auth“ in der Anfrage vorhanden ist, und Autorisierungscookies verwenden.

Dies ist das einzige Antwortformat, das von der Google Visualization API-Methode google.visualization.Query.send() angegeben wird. Einige Beispiele für JSON-Anfragen und -Antworten finden Sie am Ende dieser Seite unter Beispiele. Sie können die Antwortbibliothek mit den Hilfsbibliotheken Java oder Python erstellen.

Dieses Antwortformat ist ein UTF-8-codiertes JSON-Objekt (ein Objekt, das von geschweiften Klammern { } umschlossen wird, wobei jedes Attribut durch ein Komma getrennt ist). Sie enthält die Attribute in der folgenden Tabelle (die Daten werden dem Attribut table zugewiesen). Dieses JSON-Objekt muss in den Parameterwert responseHandler aus der Anfrage eingebunden werden. Wenn der responseHandler-Wert der Anfrage also „myHandler“ war, sollten Sie einen String wie diesen zurückgeben (nur der Einfachheit halber wird diese Property angezeigt):

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

Wenn die Anfrage keinen responseHandler-Wert enthielt, ist der Standardwert „google.visualization.Query.setResponse“. Sie sollten daher einen String wie den folgenden zurückgeben (nur der Einfachheit halber wird ein Attribut angezeigt):

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

Folgende Mitglieder des Antwortobjekts sind verfügbar:

Attribut
Erforderlich?
Beschreibung
Version
Nein

Eine Stringnummer, die die Versionsnummer des Wirtsprotokolls von Google Visualization angibt. Wenn keine Angabe erfolgt, verwendet der Client die neueste Version.

Beispiel: version=0.6

Anfragen-ID
Ja*
Eine Stringnummer, die die ID dieser Anfrage für diesen Client angibt. Wenn dies in der Anfrage der Fall war, geben Sie denselben Wert zurück. Weitere Informationen finden Sie in der Beschreibung zu reqId im Anfragebereich.

* Wenn dieser Parameter nicht in der Anfrage angegeben wurde, müssen Sie ihn nicht in der Antwort angeben.
Status
Ja

Ein String, der den Erfolg oder Misserfolg dieses Vorgangs beschreibt. Muss einer der folgenden Werte sein:

  • ok – Erfolgreiche Anfrage. Das Attribut table muss eine Tabelle enthalten.
  • warning – Es gab Probleme. Das Attribut table muss eine Tabelle enthalten.
  • error – Ein Problem ist aufgetreten. Wenn Sie das tun, sollten Sie table nicht und errors zurückgeben.

Beispiel: status:'warning'

Warnungen
Nur wenn status=warning

Ein Array mit einem oder mehreren Objekten, die jeweils ein nicht schwerwiegendes Problem beschreiben. Erforderlich, wenn status=warning, ansonsten nicht zulässig. Jedes Objekt hat die folgenden Stringattribute (gibt für jedes Attribut nur einen Wert zurück):

  • reason – [erforderlich]: Eine aus einem Wort bestehende Stringbeschreibung der Warnung. Das Protokoll definiert die folgenden Werte, aber Sie können bei Bedarf auch eigene Werte definieren. Der Client verarbeitet jedoch keine benutzerdefinierten Werte auf bestimmte Weise. Sie können nur einen reason-Wert haben:
    • data_truncated: Beim zurückgegebenen DataTable wurden einige Zeilen entfernt. Das kann daran liegen, dass der Nutzer einen Abfragestring eingefügt hat, mit dem die Ergebnisliste gekürzt wurde, oder die Datenquelle aus irgendeinem Grund keine vollständigen Ergebnisse zurückgeben möchte.
    • other: Eine allgemeine, nicht spezifizierte Warnung.
  • message – [optional]: Ein kurzer String in Anführungszeichen, in dem das Problem beschrieben wird. Kann als Titel für ein Benachrichtigungsfeld verwendet werden. Dies kann dem Nutzer angezeigt werden. HTML wird nicht unterstützt.
  • detailed_message – [optional] eine detaillierte Stringnachricht in Anführungszeichen, die das Problem und mögliche Lösungen beschreibt Das einzige unterstützte HTML-Element ist das <a>-Element mit einem einzelnen href-Attribut. Unicode-Codierung wird unterstützt. Dies kann dem Nutzer angezeigt werden.

Beispiel: warnings:[{reason:'data_truncated',message:'Retrieved data was truncated'}]

Fehler
Erforderlich, wenn status=error

Ein Array mit einem oder mehreren Objekten, die jeweils einen Fehler beschreiben. Erforderlich, wenn status=error, ansonsten nicht zulässig. Dies ähnelt dem Wert warnings. Der Fehler not_modified ist zwar kein Fehler, stellt aber keinen Fehler für den Client dar.

Das Array enthält die folgenden Stringmitglieder (nur ein Wert pro Mitglied):

  • reason – [erforderlich]: Entspricht warnings.reason, aber die folgenden Werte sind definiert:
    • not_modified: Die Daten haben sich seit der letzten Anfrage nicht geändert. Wenn dies der Grund für den Fehler ist, sollten Sie keinen Wert für table haben.
    • user_not_authenticated: Geben Sie diesen Wert an, wenn die Datenquelle eine Authentifizierung erfordert. Der Client zeigt dann eine Benachrichtigung mit dem Wert message an.
    • unknown_data_source_id
    • access_denied
    • unsupported_query_operation
    • invalid_query
    • invalid_request
    • internal_error
    • not_supported
    • illegal_formatting_patterns
    • other: Ein allgemeiner, nicht spezifizierter Fehler.
  • message - [Optional] Entspricht warnings.message Hinweis:Es ist möglich, dass ein böswilliger Nutzer einen detaillierten Datenstring verwendet, um auf nicht autorisierte Daten zuzugreifen oder diese sogar zum Angriff auf deine Daten oder deine Website zu nutzen. Wenn Sie Daten speichern, die sicher sein sollten, oder Nutzerabfragen direkt verarbeiten, sollten Sie keine ausführliche Fehlermeldung zurückgeben, die Informationen für Angreifer zur Verfügung stellen könnte. Stattdessen sollten Sie eine allgemeine Nachricht wie "Falscher Abfragestring" verwenden.
  • detailed_message - [Optional] Entspricht warnings.detailed_message In der Warnung finden Sie detaillierte Informationen zu message.

Beispiel:status:'error',errors:[{reason:'not_modified',message:'Data not modified'}]

Si
Nein

Ein Hashwert des Tabellenobjekts. Nützlich für die Optimierung der Datenübertragung zwischen dem Client und der Datenquelle. Sie können einen beliebigen Hash-Algorithmus auswählen. Wenn Sie dieses Attribut unterstützen, sollten Sie den vom Client übergebenen Wert zurückgeben, wenn keine Daten zurückgegeben werden. Wenn neue Daten zurückgegeben werden, geben Sie einen neuen Hash zurück.

Beispiel: sig:'5982206968295329967'

table
Nein

Ein DataTable-Objekt im JavaScript-Literalformat mit Ihren Daten. Weitere Informationen zum Format dieses Objekts findest du im verlinkten Referenzabschnitt. Hier ein Beispiel für eine einfache Datentabelle:

{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'}]}
      ]
} 

Das Attribut table sollte nur vorhanden sein, wenn status=ok oder status=warning. Wenn Sie keine Daten zurückgeben, fügen Sie diese Property nicht hinzu, das heißt, geben Sie die Property mit einem leeren Stringwert nicht zurück.

Beispiel: Siehe Beispiele unten.

 

Striktes JSON erforderlich

Die Hilfsbibliotheken von Google und alle an Google gesendeten Anfragen geben JSON/JSONP zurück. Wenn Sie den zurückgegebenen Code nicht selbst parsen, spielt dies für Sie keine Rolle. Wenn ja, können Sie den JSON-String mit JSON.parse() in ein JavaScript-Objekt konvertieren. Ein Unterschied bei der Verarbeitung von JSON durch die API ist, dass JSON keine JavaScript-Datumswerte unterstützt (z. B. „new Date(2008,1,28,0,31,26)“). Die API unterstützt jedoch eine gültige JSON-Darstellung von Daten als String im folgenden Format: Date(year, month, day[,hour, minute, second[, millisecond]]), wobei alles nach dem Tag optional ist und Monate nullbasiert sind.

 

JSON-Antworten optimieren

Wenn ein Client zwei Anfragen sendet und sich die Daten zwischen den Anfragen nicht geändert haben, ist es sinnvoll, die Daten nicht noch einmal zu senden. Das würde Bandbreite beanspruchen. Um die Effizienz von Anfragen zu erhöhen, unterstützt das Protokoll das Caching der Daten auf dem Client und das Senden eines Signals in der Antwort, wenn sich die Daten seit der letzten Anfrage nicht geändert haben. Dies funktioniert folgendermaßen:

  1. Der Client sendet eine Anfrage an die Datenquelle.
  2. Die Datenquelle generiert eine DataTable sowie einen Hash des DataTable-Objekts und gibt beide Antworten in seiner Antwort zurück. Der Hash wird im Parameter tqx.sig zurückgegeben. Der Google Visualization API-Client speichert die Werte DataTable und sig im Cache.
  3. Der Client sendet eine weitere Datenanfrage, einschließlich des im Cache gespeicherten Werts tqx.sig.
  4. Für die Datenquelle gibt es zwei Möglichkeiten:
    • Wenn sich die Daten aus der vorherigen Anfrage geändert haben, sendet die Datenquelle den neuen DataTable- und den sig-Wert-Hash zurück.
    • Wenn sich die Daten aus der vorherigen Anfrage nicht geändert haben, sendet die Datenquelle status=error, reason=not_modified, sig=old_sig_value zurück.
  5. In beiden Fällen erhält die Seite, auf der das Diagramm gehostet wird, eine erfolgreiche Antwort und kann die DataTable durch Aufrufen von QueryResponse.getDataTable() abrufen. Wenn die Daten identisch sind, handelt es sich einfach um die im Cache gespeicherte Version der Tabelle.

Dies funktioniert nur bei JSON-Anfragen aus Diagrammen, die in der Google Visualization API erstellt wurden.

Format der CSV-Antwort

Wenn in der Anfrage out:csv angegeben ist, enthält die Antwort keine Metadaten, sondern eine CSV-Darstellung der Daten. Eine CSV-Tabelle ist in der Regel eine durch Kommas getrennte Liste, wobei jede Datenzeile eine durch Kommas getrennte Liste von Werten ist und mit einem UNIX-Zeilenumbruchzeichen (\n) endet. Die Zellenwerte müssen für jede Spalte denselben Typ haben. Die erste Zeile enthält die Spaltenbezeichnungen. Hier ein Beispiel für eine dreispaltige Tabelle mit drei Spalten:

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

Das CSV-Format wird durch dieses Protokoll nicht angegeben. Die Datenquelle ist für die Definition des CSV-Formats verantwortlich. Ein gängiges Format besteht jedoch aus einer Reihe von Werten, die durch Kommas (ohne Leerzeichen) und einen Zeilenumbruch (\n) am Ende jeder Zeile getrennt sind. Wenn ein Browser eine CSV-Stringantwort erhält, wird er unter Umständen gefragt, mit welcher Anwendung der String geöffnet werden soll, oder er wird einfach auf dem Bildschirm gerendert. Die Open-Source-Bibliotheken Java und Python bieten eine Methode zum Konvertieren einer DataTable in einen CSV-String.

Wenn die Anfrage ein outFileName-Mitglied des Parameters tqx enthält, sollten Sie den angegebenen Dateinamen in die Antwortheader aufnehmen.

Das google.visualization.Query-Objekt unterstützt keine Anfrage für eine CSV-Antwort. Wenn ein Client eine CSV-Datei anfordern möchte, kannst du ein Visualisierungs-Toolbar-Gadget auf deiner Seite einbetten oder einen benutzerdefinierten Code zum Erstellen der Anfrage verwenden. Alternativ kannst du auch einen Link angeben, mit dem das Attribut out:csv von tqx explizit festgelegt wird, wie in der folgenden Anfrage-URL gezeigt:

Anfrage

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

Antwort

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

TSV-Antwortformat

Wenn in der Anfrage out:tsv-excel angegeben ist, enthält die Antwort keine Metadaten, sondern eine tabulatorgetrennte Darstellung der Daten, utf-16-codiert. Wenn die Anfrage ein outFileName-Mitglied des Parameters tqx enthält, sollten Sie den angegebenen Dateinamen in die Antwortheader aufnehmen.

HTML-Antwortformat

Wenn in der Anfrage out:html angegeben ist, sollte die Antwort eine HTML-Seite sein, die eine HTML-Tabelle mit den Daten definiert. Dies ist nützlich für die Fehlerbehebung in Ihrem Code, da der Browser das Ergebnis direkt in einem lesbaren Format rendern kann. Mit dem Objekt google.visualization.Query können Sie keine Abfrage für eine HTML-Antwort senden. Sie müssen eine Abfrage für eine HTML-Antwort unter Verwendung von benutzerdefiniertem Code stellen oder indem Sie eine URL ähnlich der folgenden in Ihren Browser eingeben:

Anfrage

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

Antwort

<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>

Beispiele

Hier sehen Sie einige Beispielanfragen und -antworten. Anfragen werden nicht mit URL-Escape-Zeichen versehen. Dies erfolgt normalerweise über den Browser oder das Objekt google.visualization.Query.

Einfache Anfrage: Die grundlegenden Informationen werden mit einer Tabelle mit drei Spalten und vier Zeilen zurückgegeben.

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'}]}]}});

Einfache Anfrage mit einem Antwort-Handler: Gibt eine Tabelle mit drei Spalten und drei Zeilen mit verschiedenen Datentypen zurück.

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'}]}]}});

Abfrage mit einem einfachen Abfragestring:Eine einzelne Spalte mit vier Zeilen wird als Anfrage zurückgegeben.

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'}]}]}});

Fehler „Daten nicht geändert“:Beispiel für einen not_modified-Fehler.

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'}]});

Warnung zur Daten abgeschnitten:Beispiel für eine data_truncated-Warnung. Die Anfrage gibt weiterhin Daten zurück.

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'}]}]}});

Fehler „Zugriff verweigert“:Beispiel für einen access_denied-Fehler.

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'}]});

Ungültiger Abfragestring: Beispiel für eine Anfrage mit einem ungültigen Abfragestring. Beachten Sie, dass es sich bei der detaillierten Nachricht um eine allgemeine Nachricht und nicht um die tatsächliche Fehlermeldung handelt.

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.'}]});

Entwicklungstools

  • Java Datasource Library (von Google) – verarbeitet die Anfrage und Antwort, erstellt die Antworttabelle aus den von dir bereitgestellten Daten und implementiert die SQL-Abfragesprache der Google Chart Tools.
  • Python-Datenquellenbibliothek (von Google): Erstellt eine Antworttabelle und generiert die Antwortsyntax. Kann keine Anfragen analysieren oder die SQL-Abfragesprache Google Chart Tools implementieren
  • MC-Google_Visualization (Drittanbieter): Dies ist eine serverseitige PHP-Bibliothek, mit der Sie eine Diagrammtools-Datenquelle für MySQL-, SQLite- und PostgreSQL-Datenbankmodule mit PDO implementieren können.
  • bortosky-google-visualization (Drittanbieter) ist eine Hilfsbibliothek zum Erstellen einer Google Visualization API-Datentabelle für .NET-Nutzer.
  • GV-Streamer (Drittanbieter): GV Streamer ist ein serverseitiges Tool, das Daten aus verschiedenen Quellen in gültige Abfrageantworten in Google-Diagramme umwandeln kann. GV Streamer unterstützt mehrere Sprachen (z. B. PHP, Java, .NET) und verschiedene Rohdatenquellen (z. B. MySql).
  • TracGViz (Drittanbieter): TracGViz ist ein kostenloses Open-Source-Tool, das Komponenten zur Verfügung stellt, damit Trac die Chart-Gadgets nutzen und von Trac verwaltete Daten als Datenquelle für Google Chart-Tools implementieren kann.
  • vis-table (Drittanbieter): Eine Bibliothek, die eine Google Chart Tools-Datenquelle in PHP implementiert. Sie besteht aus drei Hauptteilen. Die Datatable-Implementierung selbst, der Parser für die Abfragesprache und die Formatierer.
  • Implementierung von Google-Datenquellen in Oracle PL/SQL (Drittanbieter): Oracle-PL/SQL-Paket, mit dem Oracle Datenquellen direkt aus der Datenbank bereitstellen kann. Sie können also jede Oracle-Abfrage als Google Chart Tools-Datenquelle verwenden. Das Paket gibt dann eine JSON-Datei mit den Daten zurück. Die Google Query Language wird fast vollständig unterstützt.