查询 V2 HTTP 响应

使用 “版本 ”下拉列表切换服务。 了解有关导航的详细信息。
适用于:✅ Azure Data Explorer

HTTP 响应状态行

如果请求成功,则 HTTP 响应状态代码为 200 OK。 HTTP 响应正文是一个 JSON 数组,如下所述。

如果请求失败,则 HTTP 响应状态代码为 4xx 或 5xx 错误。 原因短语将包含有关失败的更多信息。 HTTP 响应正文是一个 JSON 对象,如下所述。

注意

请求可能返回状态代码“200 OK”,但 HTTP 响应正文将指示错误。 如果在已返回 HTTP 状态行后引发错误,则可能发生这种情况。 阅读者应明确地检查是否存在这种情况。

HTTP 响应标头

无论请求是成功还是失败,响应中都包含两个自定义 HTTP 标头:

  1. x-ms-client-request-id:服务返回一个不透明字符串,以标识用于关联目的的请求/响应对。 如果请求包含客户端请求 ID,则其值将在此处显示,否则将返回某个随机字符串。

  2. x-ms-activity-id:服务返回一个不透明字符串,以唯一标识用于关联目的的请求/响应对。 与 x-ms-client-request-id 不同,此标识符不受请求中任何信息影响,并且每个响应也是唯一的。

HTTP 响应正文(请求失败时)

请求失败时,HTTP 响应正文是一个根据 OneApiErrors 规则设置格式的 JSON 文档。 有关 OneApiErrors 格式的说明,请参阅第 7.10.2 节 here。 下面是此类失败的示例。

{
    "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 响应正文(请求成功时)

请求成功时,HTTP 响应正文是一个对请求结果进行编码的 JSON 数组。

从逻辑上讲,V2 响应描述一个 DataSet 对象,该对象包含任意数量的表 。 这些表可以表示请求的实际数据,或者关于请求执行的附加信息(例如请求所消耗的资源的统计)。 此外,即使返回 200 OK 状态,实际请求也可能会失败(由于存在各种情况)。在这种情况下,响应将包含部分响应数据以及一个表明存在错误的指示。

根本上讲,响应正文的 JSON 数组是 JSON 对象的列表,其中每个对象称为一个帧。 DataSet 对象编码为两个帧 :DataSetHeader 和 DataSetCompletion。 前者始终是第一个帧,而后者始终是最后一个帧。 在它们“之间”,可以找到描述 Table 对象的帧。

可以通过两种方式对 Table 对象进行编码:

  1. 作为单个帧:DataTable。 这是默认设置。

  2. 或者,作为四种帧的“混合”:TableHeader(首先出现并对表格进行说明)、TableFragment(描述表格中的数据)、TableProgress(这是可选的,并估计我们在表格数据进行到哪一步了)和 TableCompletion(这是表格的最后一帧)。

第二种情况称为“渐进模式”,并且仅在客户端请求属性 results_progressive_enabled 设置为 true 时显示。 在本例中,每个 TableFragment 帧都对之前表中所有此类帧积累的数据更新进行了描述,要么作为追加操作,要么作为替换操作。 (例如,当在查询的“顶层”执行一些长时间运行的聚合计算时,就会使用后者,因此初始的聚合结果稍后便会被更准确的结果所取代。)

DataSetHeader

DataSetHeader 帧始终是数据集中的第一个帧,并且只出现一次。

{
    "Version": string,
    "IsProgressive": Boolean
}

其中:

  • Version 是协议版本。 当前版本为 v2.0。

  • IsProgressive 是一个布尔标志,指示此数据集是否包含渐进式帧。 渐进式帧是下列项之一:

    Frame 说明
    TableHeader 包含有关表的常规信息
    TableFragment 包含表的矩形数据分片
    TableProgress 包含以百分比表示的进度 (0-100)
    TableCompletion 指示此帧是最后一帧

    上述帧描述了一个表。 如果 IsProgressive 标志未设置为 true,则将使用单个帧对集中的每个表进行序列化:

  • DataTable:包含客户端所需的有关数据集中的单个表的所有信息。

TableHeader

如果将 results_progressive_enabled 选项设置为 true,则进行的查询可能包含此帧。 根据此表,客户端可以期望得到一个包含 TableFragment 和 TableProgress 帧的交织序列。 表的最后一帧是 TableCompletion。

{
    "TableId": Number,
    "TableKind": string,
    "TableName": string,
    "Columns": Array,
}

其中:

  • TableId 是表的唯一 ID。

  • TableKind 是下列项之一:

    • PrimaryResult
    • QueryCompletionInformation
    • QueryTraceLog
    • QueryPerfLog
    • TableOfContents
    • QueryProperties
    • QueryPlan
    • 未知
  • TableName 是表的名称。

  • Columns 是描述表的架构的数组。

{
    "ColumnName": string,
    "ColumnType": string,
}

此处介绍了支持的列类型。

TableFragment

TableFragment 帧包含表的矩形数据片段。 除了实际数据之外,此帧还包含一个 TableFragmentType 属性,该属性告知客户端使用片段to do。 此片段将追加到现有片段,或替换它们。

{
    "TableId": Number,
    "FieldCount": Number,
    "TableFragmentType": string,
    "Rows": Array
}

其中:

  • TableId 是表的唯一 ID。

  • FieldCount 是表中的列数。

  • TableFragmentType 描述客户端应如何处理此片段。 TableFragmentType 是下列项之一:

    • DataAppend
    • DataReplace
  • Rows 是包含片段数据的二维数组。

TableProgress

TableProgress 帧可以与上面所述的 TableFragment 帧交织出现。 其唯一用途是告知客户端查询进度。

{
    "TableId": Number,
    "TableProgress": Number,
}

其中:

  • TableId 是表的唯一 ID。
  • TableProgress 是以百分比表示的进度 (0-100)。

TableCompletion

TableCompletion 帧标记表传输的结束。 不会再发送与该表相关的帧。

{
    "TableId": Number,
    "RowCount": Number,
}

其中:

  • TableId 是表的唯一 ID。
  • RowCount 是表中的总行数。

DataTable

当 EnableProgressiveQuery 标志设置为 false 时,发出的查询将不包括任何帧(TableHeader、TableFragment、TableProgress 和 TableCompletion)。 相反,数据集中的每个表都将使用 DataTable 帧进行传输,该帧包含客户端读取该表需要的所有信息。

{
    "TableId": Number,
    "TableKind": string,
    "TableName": string,
    "Columns": Array,
    "Rows": Array,
}

其中:

  • TableId 是表的唯一 ID。

  • TableKind 是下列项之一:

    • PrimaryResult
    • QueryCompletionInformation
    • QueryTraceLog
    • QueryPerfLog
    • QueryProperties
    • QueryPlan
    • 未知
  • TableName 是表的名称。

  • Columns 是描述表的架构的数组,并且包括:

{
    "ColumnName": string,
    "ColumnType": string,
}
  • Rows 是包含表的数据的二维数组。

响应中的表的含义

  • PrimaryResult - 查询的主要表格结果。 对于每个表格表达式语句,将按顺序生成一个或多个表,表示该语句产生的结果。 由于存在批次和分支运算符,可能会有多个这样的表。
  • QueryCompletionInformation - 提供有关查询本身的执行的附加信息(例如,它是否已成功完成)以及查询使用的资源(类似于 v1 响应中的 QueryStatus 表)。
  • QueryProperties - 提供附加值,如客户端可视化效果说明(例如,发出这些说明以反映 render 运算符中的信息)和数据库游标信息。
  • QueryTraceLog - 性能跟踪日志信息(当perftrace中的 设置为 true 时返回)。

DataSetCompletion

DataSetCompletion 帧是数据集中的最后一帧。

{
    "HasErrors": Boolean,
    "Cancelled": Boolean,
    "OneApiErrors": Array,
}

其中:

  • 如果生成数据集时出现错误,则 HasErrors 为 true。
  • 如果导致生成数据集的请求在完成前被取消,则 Cancelled 为 true。
  • 只有 OneApiErrors 为 true 时才会返回 HasErrors。 有关 OneApiErrors 格式的说明,请参阅第 7.10.2 节 here。