Руководство пользователя для версии 7.9
Предыдущие версии: 7.8 | 7.7
×

Примеры запросов BI Analytics API

В этой статье приведены примеры запросов для работы с BI Analytics API. Их можно использовать как основу для подключения Power BI или другой BI-системы, поддерживающей работу с REST API.
В зависимости от задачи вы можете выбрать один из двух вариантов:
  • Базовый пример — подходит для знакомства с API, тестирования подключения и создания простых интеграций. Он показывает минимально необходимый набор действий для авторизации, выполнения запроса и получения данных.
  • Расширенный пример — рекомендуется для рабочих интеграций и регулярного обновления данных. Помимо авторизации и получения данных, он включает обработку ошибок API, проверку структуры ответа, обработку пустых результатов и автоматическое преобразование данных в формат, удобный для Power BI.
Рекомендуется использовать расширенный пример в рабочих проектах, так как он обеспечивает более надёжную обработку ошибок и упрощает дальнейшую поддержку интеграции.
 

Базовый пример запроса

let
    BaseUrl = "https://<server_address>",
 
    LoginJson =
        Json.Document(
            Web.Contents(
                BaseUrl,
                [
                    RelativePath = "api/bi/login.php",
                    Headers = [#"Content-Type" = "application/json"],
                    Content = Json.FromValue([
                        username = "YOUR_LOGIN",
                        password = "YOUR_PASSWORD"
                    ]),
                    ManualStatusHandling = {400, 401, 403, 404, 500}
                ]
            )
        ),
 
    Token = LoginJson[access_token],
    NodeId = LoginJson[user][node_id],
 
    AnalyticsJson =
        Json.Document(
            Web.Contents(
                BaseUrl,
                [
                    RelativePath = "api/bi/analytics.php",
                    Query = [node = Text.From(NodeId)],
                    Headers = [
                        #"Authorization" = "Bearer " & Token,
                        #"Content-Type" = "application/json"
                    ],
                    Content = Json.FromValue([
                        date_from = "2026-01-01",
                        date_to = "2026-12-31",
                        metrics = {
                            "veh_driving_dist",
                            "veh_fuel_cons",
                            "average_speed",
                            "veh_cars_counter"
                        },
                        source = "vehicle",
                        group_by = "source_day",
                        format = "flat"
                    ]),
                    ManualStatusHandling = {400, 401, 403, 404, 500},
                    ExcludedFromCacheKey = {"Authorization"}
                ]
            )
        ),
 
    DataList = AnalyticsJson[data],
    Tbl = Table.FromList(DataList, Splitter.SplitByNothing(), {"Column1"}),
    Expanded = Table.ExpandRecordColumn(
        Tbl,
        "Column1",
        {"source_id", "date", "veh_driving_dist", "veh_fuel_cons", "average_speed", "veh_cars_counter"}
    )
in
    Expanded
 

Расширенный пример запроса

Этот пример включает обработку ошибок API, проверку структуры ответа и автоматическое преобразование данных в таблицу Power BI.
let
    BaseUrl = "https://pilot-gps.com",
 
    // --- ОБРАБОТКА ОШИБОК API ---
    ApiJson =
        (Response as binary, Context as text) as record =>
            let
                Status =
                    try Value.Metadata(Response)[Response.Status]
                    otherwise 200,
 
                ParsedJson =
                    try Json.Document(Response)
                    otherwise
                        error Error.Record(
                            Context,
                            "API response is not valid JSON",
                            [
                                status = Status,
                                body = Text.FromBinary(Response)
                            ]
                        ),
 
                ErrorMessage =
                    if Record.HasFields(ParsedJson, "error_description") then
                        ParsedJson[error_description]
                    else if Record.HasFields(ParsedJson, "msg") then
                        ParsedJson[msg]
                    else if Record.HasFields(ParsedJson, "errors") then
                        Text.Combine(List.Transform(ParsedJson[errors], each Text.From(_)), "; ")
                    else if Record.HasFields(ParsedJson, "error") then
                        Text.From(ParsedJson[error])
                    else
                        "API request failed",
 
                CheckedJson =
                    if Status >= 400 then
                        error Error.Record(
                            Context,
                            ErrorMessage,
                            ParsedJson
                        )
                    else if Record.HasFields(ParsedJson, "success")
                        and ParsedJson[success] = false then
                        error Error.Record(
                            Context,
                            ErrorMessage,
                            ParsedJson
                        )
                    else
                        ParsedJson
            in
                CheckedJson,
 
    // --- ЛОГИН ---
    LoginResponse =
        Web.Contents(
            BaseUrl,
            [
                RelativePath = "api/bi/login.php",
                Headers = [#"Content-Type" = "application/json"],
                Content = Json.FromValue([
                    username = "LOGIN",
                    password = "PASSWORD"
                ]),
                ManualStatusHandling = {400, 422, 429, 500}
            ]
        ),
 
    LoginJson = ApiJson(LoginResponse, "BI Analytics login"),
 
    Token = LoginJson[access_token],
    NodeId = LoginJson[user][node_id],
 
    NodeQuery =
        if NodeId = null then
            []
        else
            [node = Text.From(NodeId)],
 
    // --- ЗАПРОС АНАЛИТИКИ ---
    AnalyticsResponse =
        Web.Contents(
            BaseUrl,
            [
                RelativePath = "api/bi/analytics.php",
                Query = NodeQuery,
                Headers = [
                    #"Authorization" = "Bearer " & Token,
                    #"Content-Type" = "application/json"
                ],
                Content = Json.FromValue([
                    date_from = "2026-01-01",
                    date_to = "2026-12-31",
                    metrics = {
                        "veh_driving_dist",
                        "veh_fuel_cons",
                        "average_speed",
                        "veh_cars_counter"
                    },
                    source = "vehicle",
                    group_by = "source_day",
                    format = "flat",
                    page = 1,
                    per_page = 100
                ]),
                ManualStatusHandling = {400, 422, 429, 500},
                ExcludedFromCacheKey = {"Authorization"}
            ]
        ),
 
    AnalyticsJson =
        ApiJson(
            AnalyticsResponse,
            "BI Analytics request"
        ),
 
    // --- ПРОВЕРКА DATA ---
    DataList =
        if Record.HasFields(AnalyticsJson, "data") then
            AnalyticsJson[data]
        else
            error Error.Record(
                "BI Analytics response",
                "Response does not contain data field",
                AnalyticsJson
            ),
 
    // --- ПРЕОБРАЗОВАНИЕ В ТАБЛИЦУ ---
    Tbl =
        if List.IsEmpty(DataList) then
            #table(
                {
                    "source_id",
                    "date",
                    "veh_driving_dist",
                    "veh_fuel_cons",
                    "average_speed",
                    "veh_cars_counter"
                },
                {}
            )
        else
            Table.FromList(
                DataList,
                Splitter.SplitByNothing(),
                {"Column1"}
            ),
 
    Expanded =
        if List.IsEmpty(DataList) then
            Tbl
        else
            Table.ExpandRecordColumn(
                Tbl,
                "Column1",
                {
                    "source_id",
                    "date",
                    "veh_driving_dist",
                    "veh_fuel_cons",
                    "average_speed",
                    "veh_cars_counter"
                }
            ),
 
    #"Changed Types" =
        Table.TransformColumnTypes(
            Expanded,
            {
                {"source_id", Int64.Type},
                {"date", type date},
                {"veh_driving_dist", type number},
                {"veh_fuel_cons", type number},
                {"average_speed", type number},
                {"veh_cars_counter", Int64.Type}
            }
        ),
 
    #"Sorted Rows" =
        Table.Sort(
            #"Changed Types",
            {
                {"source_id", Order.Ascending},
                {"date", Order.Ascending}
            }
        )
in
    #"Sorted Rows"