Abfragen einer V2-HTTP-Antwort
HTTP-Antwort status Zeile
Wenn die Anforderung erfolgreich ist, lautet 200 OK
die HTTP-Antwort status Code .
Der HTTP-Antworttext ist ein JSON-Array, wie unten erläutert.
Wenn die Anforderung fehlschlägt, ist die HTTP-Antwort status Code ein 4xx
- oder 5xx
-Fehler.
Der Grundausdruck enthält zusätzliche Informationen zum Fehler.
Der HTTP-Antworttext ist ein JSON-Objekt, wie unten erläutert.
Hinweis
Die Anforderung gibt möglicherweise einen status Code von 200 OK
zurück, aber der HTTP-Antworttext weist auf einen Fehler hin. Dies kann der Fall sein, wenn der Fehler ausgelöst wird, nachdem die HTTP-status Zeile bereits zurückgegeben wurde. Es wird erwartet, dass der Leser explizit nach einer solchen Bedingung sucht.
HTTP-Antwortheader
Unabhängig vom Erfolg/Fehler der Anforderung sind zwei benutzerdefinierte HTTP-Header in der Antwort enthalten:
x-ms-client-request-id
: Der Dienst gibt eine undurchsichtige Zeichenfolge zurück, die das Anforderungs-Antwort-Paar zu Korrelationszwecken identifiziert. Wenn die Anforderung eine Clientanforderungs-ID enthält, wird ihr Wert hier angezeigt. Andernfalls wird eine zufällige Zeichenfolge zurückgegeben.x-ms-activity-id
: Der Dienst gibt eine undurchsichtige Zeichenfolge zurück, die das Anforderungs-Antwort-Paar zu Korrelationszwecken eindeutig identifiziert. Im Gegensatz zux-ms-client-request-id
ist dieser Bezeichner nicht von Informationen in der Anforderung betroffen und pro Antwort eindeutig.
HTTP-Antworttext (bei Anforderungsfehler)
Bei einem Anforderungsfehler ist der HTTP-Antworttext ein JSON-Dokument, das gemäß OneApiErrors
Regeln formatiert ist. Eine Beschreibung des OneApiErrors
Formats finden Sie hier in Abschnitt 7.10.2.
Im Folgenden finden Sie ein Beispiel für einen solchen Fehler.
{
"error": {
"code": "General_BadRequest",
"message": "Request is invalid and cannot be executed.",
"@type": "Kusto.Data.Exceptions.KustoBadRequestException",
"@message": "Request is invalid and cannot be processed: Semantic error: SEM0100: 'table' operator: Failed to resolve table expression named 'aaa'",
"@context": {
"timestamp": "2023-04-18T12:59:27.4855445Z",
"serviceAlias": "HELP",
"machineName": "KEngine000000",
"processName": "Kusto.WinSvc.Svc",
"processId": 12580,
"threadId": 10260,
"clientRequestId": "Kusto.Cli;b90f4260-4eac-4574-a27a-3f302db21404",
"activityId": "9dcc4522-7b51-41db-a7ae-7c1bfe0696b2",
"subActivityId": "d0f30c8c-e6c6-45b6-9275-73dd6b379ecf",
"activityType": "DN.FE.ExecuteQuery",
"parentActivityId": "6e3c8dab-0aaf-4df5-85b5-fc20b0b29a84",
"activityStack": "(Activity stack: CRID=Kusto.Cli;b90f4260-4eac-4574-a27a-3f302db21404 ARID=9dcc4522-7b51-41db-a7ae-7c1bfe0696b2 > KD.Query.Client.ExecuteQueryAsKustoDataStream/8191428e-7139-4c5d-9da7-839a0f21c5b9 > P.WCF.Service.ExecuteQueryAsKustoDataStream..IInterNodeCommunicationQueryContract/6e3c8dab-0aaf-4df5-85b5-fc20b0b29a84 > DN.FE.ExecuteQuery/d0f30c8c-e6c6-45b6-9275-73dd6b379ecf)"
},
"@permanent": true,
"@text": "aaa",
"@database": "Samples",
"@ClientRequestLogger": "",
"innererror": {
"code": "SEM0100",
"message": "'table' operator: Failed to resolve table expression named 'aaa'",
"@type": "Kusto.Data.Exceptions.SemanticException",
"@message": "Semantic error: SEM0100: 'table' operator: Failed to resolve table expression named 'aaa'",
"@context": {
"timestamp": "2023-04-18T12:59:27.4855445Z",
"serviceAlias": "HELP",
"machineName": "KEngine000000",
"processName": "Kusto.WinSvc.Svc",
"processId": 12580,
"threadId": 10260,
"clientRequestId": "Kusto.Cli;b90f4260-4eac-4574-a27a-3f302db21404",
"activityId": "9dcc4522-7b51-41db-a7ae-7c1bfe0696b2",
"subActivityId": "d0f30c8c-e6c6-45b6-9275-73dd6b379ecf",
"activityType": "DN.FE.ExecuteQuery",
"parentActivityId": "6e3c8dab-0aaf-4df5-85b5-fc20b0b29a84",
"activityStack": "(Activity stack: CRID=Kusto.Cli;b90f4260-4eac-4574-a27a-3f302db21404 ARID=9dcc4522-7b51-41db-a7ae-7c1bfe0696b2 > KD.Query.Client.ExecuteQueryAsKustoDataStream/8191428e-7139-4c5d-9da7-839a0f21c5b9 > P.WCF.Service.ExecuteQueryAsKustoDataStream..IInterNodeCommunicationQueryContract/6e3c8dab-0aaf-4df5-85b5-fc20b0b29a84 > DN.FE.ExecuteQuery/d0f30c8c-e6c6-45b6-9275-73dd6b379ecf)"
},
"@permanent": true,
"@errorCode": "SEM0100",
"@errorMessage": "'table' operator: Failed to resolve table expression named 'aaa'"
}
}
}
HTTP-Antworttext (bei erfolgreicher Anforderung)
Bei erfolgreicher Anforderung ist der HTTP-Antworttext ein JSON-Array, das die Anforderungsergebnisse codiert.
Logischerweise beschreibt die V2-Antwort ein DataSet-Objekt , das eine beliebige Anzahl von Tabellen enthält. Diese Tabellen können die tatsächlichen Daten darstellen, die von der Anforderung angefordert werden, oder zusätzliche Informationen zur Ausführung der Anforderung (z. B. eine Abrechnung der von der Anforderung verbrauchten Ressourcen). Darüber hinaus kann die tatsächliche Anforderung (aufgrund verschiedener Bedingungen) tatsächlich fehlschlagen, obwohl ein 200 OK
status zurückgegeben wird. In diesem Fall enthält die Antwort Teilantwortdaten sowie einen Hinweis auf die Fehler.
Physisch ist das JSON-Array des Antworttexts eine Liste von JSON-Objekten, von denen jedes als Frame bezeichnet wird. Das DataSet-Objekt wird in zwei Frames codiert: DataSetHeader und DataSetCompletion. Der erste ist immer der erste Frame, und der zweite ist immer der letzte Frame. In "dazwischen" finden Sie die Frames, die die Table-Objekte beschreiben.
Die Table-Objekte können auf zwei Arten codiert werden:
Als einzelner Frame: DataTable. Dies ist die Standardoption.
Alternativ als "Mischung" aus vier Frames: TableHeader (der zuerst kommt und die Tabelle beschreibt), TableFragment (beschreibt die Daten einer Tabelle), TableProgress (ist optional und bietet eine Schätzung, wie weit wir in den Daten der Tabelle sind) und TableCompletion (das ist der letzte Frame der Tabelle).
Der zweite Fall wird als "progressiver Modus" bezeichnet und wird nur angezeigt, wenn die Clientanforderungseigenschaft results_progressive_enabled
auf true
festgelegt ist.
In diesem Fall beschreibt jeder TableFragment-Frame eine Aktualisierung der Daten, die von allen vorherigen Frames für die Tabelle gesammelt wurden, entweder als Anfügevorgang oder als Ersetzungsvorgang. (Letzteres wird beispielsweise verwendet, wenn eine lange Aggregationsberechnung auf der "obersten Ebene" der Abfrage ausgeführt wird, sodass ein anfängliches Aggregationsergebnis später durch genauere Ergebnisse ersetzt wird.)
DataSetHeader
Der DataSetHeader
Frame ist immer der erste im Dataset und wird genau einmal angezeigt.
{
"Version": string,
"IsProgressive": Boolean
}
Hierbei gilt:
Version
ist die Protokollversion. Die aktuelle Version istv2.0
.IsProgressive
ist ein boolesches Flag, das angibt, ob dieses Dataset progressive Frames enthält. Ein progressiver Frame ist einer der folgenden:Frame BESCHREIBUNG TableHeader
Enthält allgemeine Informationen zur Tabelle. TableFragment
Enthält einen rechteckigen Datenshard der Tabelle. TableProgress
Enthält den Fortschritt in Prozent (0-100) TableCompletion
Gibt an, dass es sich bei diesem Frame um den letzten Frame handelt. Die obigen Frames beschreiben eine Tabelle. Wenn das
IsProgressive
Flag nicht auf true festgelegt ist, wird jede Tabelle in der Gruppe mit einem einzelnen Frame serialisiert:DataTable
: Enthält alle Informationen, die der Client zu einer einzelnen Tabelle im Dataset benötigt.
TableHeader
Abfragen, die mit der results_progressive_enabled
auf true festgelegten Option durchgeführt werden, können diesen Frame enthalten. Nach dieser Tabelle können Clients eine ineinandergreifende Sequenz von TableFragment
- und TableProgress
-Frames erwarten. Der letzte Rahmen der Tabelle ist TableCompletion
.
{
"TableId": Number,
"TableKind": string,
"TableName": string,
"Columns": Array,
}
Hierbei gilt:
TableId
ist die eindeutige ID der Tabelle.TableKind
ist einer dieser Werte:- PrimaryResult
- QueryCompletionInformation
- QueryTraceLog
- QueryPerfLog
- TableOfContents
- QueryProperties
- QueryPlan
- Unbekannt
TableName
ist der Name der Tabelle.Columns
ist ein Array, das das Schema der Tabelle beschreibt.
{
"ColumnName": string,
"ColumnType": string,
}
Unterstützte Spaltentypen werden hier beschrieben.
TableFragment
Der TableFragment
Rahmen enthält ein rechteckiges Datenfragment der Tabelle. Zusätzlich zu den tatsächlichen Daten enthält dieser Frame auch eine TableFragmentType
Eigenschaft, die dem Client mitteilt, was mit dem Fragment zu tun ist. Das Fragment, das an vorhandene Fragmente angefügt oder ersetzt wird.
{
"TableId": Number,
"FieldCount": Number,
"TableFragmentType": string,
"Rows": Array
}
Hierbei gilt:
TableId
ist die eindeutige ID der Tabelle.FieldCount
ist die Anzahl der Spalten in der Tabelle.TableFragmentType
beschreibt, was der Client mit diesem Fragment tun sollte.TableFragmentType
ist einer dieser Werte:- DataAppend
- DataReplace
Rows
ist ein zweidimensionales Array, das die Fragmentdaten enthält.
TableProgress
Der TableProgress
Frame kann sich mit dem TableFragment
oben beschriebenen Frame verzahnen.
Der einzige Zweck besteht darin, den Client über den Fortschritt der Abfrage zu informieren.
{
"TableId": Number,
"TableProgress": Number,
}
Hierbei gilt:
TableId
ist die eindeutige ID der Tabelle.TableProgress
ist der Fortschritt in Prozent (0--100).
TableCompletion
Der TableCompletion
Frame markiert das Ende der Tabellenübertragung. Es werden keine weiteren Frames im Zusammenhang mit dieser Tabelle gesendet.
{
"TableId": Number,
"RowCount": Number,
}
Hierbei gilt:
TableId
ist die eindeutige ID der Tabelle.RowCount
ist die Gesamtanzahl der Zeilen in der Tabelle.
DataTable
Abfragen, die mit dem EnableProgressiveQuery
auf false festgelegten Flag ausgegeben werden, enthalten keine der Frames (TableHeader
, , TableFragment
TableProgress
und TableCompletion
). Stattdessen wird jede Tabelle im Dataset mithilfe des Frames übertragen, der DataTable
alle Informationen enthält, die der Client zum Lesen der Tabelle benötigt.
{
"TableId": Number,
"TableKind": string,
"TableName": string,
"Columns": Array,
"Rows": Array,
}
Hierbei gilt:
TableId
ist die eindeutige ID der Tabelle.TableKind
ist einer dieser Werte:- PrimaryResult
- QueryCompletionInformation
- QueryTraceLog
- QueryPerfLog
- QueryProperties
- QueryPlan
- Unbekannt
TableName
ist der Name der Tabelle.Columns
ist ein Array, das das Schema der Tabelle beschreibt, und umfasst Folgendes:
{
"ColumnName": string,
"ColumnType": string,
}
Rows
ist ein zweidimensionales Array, das die Daten der Tabelle enthält.
Die Bedeutung von Tabellen in der Antwort
PrimaryResult
– Das Standard tabellenbasiertes Ergebnis der Abfrage. Für jede tabellenbasierte Ausdrucksanweisung werden eine oder mehrere Tabellen in der Reihenfolge generiert, die die von der -Anweisung erzeugten Ergebnisse darstellen. Aufgrund von Batches und Fork-Operatoren können mehrere solche Tabellen vorhanden sein.QueryCompletionInformation
– Stellt zusätzliche Informationen zur Ausführung der Abfrage selbst bereit, z. B. ob sie erfolgreich abgeschlossen wurde oder nicht, und welche Ressourcen von der Abfrage genutzt wurden (ähnlich der QueryStatus-Tabelle in der v1-Antwort).QueryProperties
– Stellt zusätzliche Werte bereit, z. B. Clientvisualisierungsanweisungen (ausgegeben, um die Informationen im Renderoperator widerzuspiegeln) und Datenbankcursorinformationen .QueryTraceLog
– Die Leistungsablaufverfolgungsprotokollinformationen (zurückgegeben, wennperftrace
in Clientanforderungseigenschaften auf true festgelegt sind).
DataSetCompletion
Der DataSetCompletion
Frame ist der letzte im Dataset.
{
"HasErrors": Boolean,
"Cancelled": Boolean,
"OneApiErrors": Array,
}
Hierbei gilt:
HasErrors
ist true, wenn beim Generieren des Datasets Fehler aufgetreten sind.Cancelled
ist true, wenn die Anforderung, die zur Generierung des Datasets geführt hat, vor Abschluss abgebrochen wurde.OneApiErrors
wird nur zurückgegeben, wennHasErrors
true ist. Eine Beschreibung desOneApiErrors
Formats finden Sie hier in Abschnitt 7.10.2.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für