You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Fit REST API按活动段聚合空数据返回400 Bad Request问题咨询

问题背景

我们通过REST接口请求按活动段聚合的用户活动数据,尽管所有请求格式一致,仍有部分用户请求失败返回400 Bad Request错误。

按活动段聚合的请求JSON示例

{
"aggregateBy": [
  {
    "dataTypeName": "com.google.activity.segment"
  },
  {
    "dataTypeName": "com.google.calories.expended"
  },
  {
    "dataTypeName": "com.google.step_count.delta"
  }
],
"bucketByActivitySegment": {
  "minDurationMillis": 60000
},
"startTimeMillis": 1627182120000,
"endTimeMillis": 1627268520000
}

有活动记录用户的正常响应示例

{
  "bucket": [
    {
      "startTimeMillis": "1627180684015",
      "endTimeMillis": "1627182139339",
      "dataset": [
        {
          "dataSourceId": "derived:com.google.activity.summary:com.google.android.gms:aggregated",
          "point": [
            {
              "startTimeNanos": "1627180684015000000",
              "endTimeNanos": "1627182139339000000",
              "dataTypeName": "com.google.activity.summary",
              "originDataSourceId": "derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments",
              "value": [
                {
                  "intVal": 7,
                  "mapVal": []
                },
                {
                  "intVal": 1455324,
                  "mapVal": []
                },
                {
                  "intVal": 1,
                  "mapVal": []
                }
              ]
            }
          ]
        },
[...]

无活动记录用户的错误响应示例

{
    "error": {
        "code": 400,
        "message": "unknown datasource: derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments",
        "errors": [
            {
                "message": "unknown datasource: derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments",
                "domain": "global",
                "reason": "invalidArgument"
            }
        ],
        "status": "INVALID_ARGUMENT"
    }
}

验证无活动记录的按时间聚合请求示例

{
"aggregateBy": [
  {
    "dataTypeName": "com.google.activity.segment"
  }
],
"bucketByTime": {
  "durationMillis": 60000
},
"startTimeMillis": 1627182120000,
"endTimeMillis": 1627268520000
}

空数据用户的时间聚合正常响应示例

{
    "bucket": [
        {
            "startTimeMillis": "1627182120000",
            "endTimeMillis": "1627182180000",
            "dataset": [
                {
                    "dataSourceId": "derived:com.google.activity.summary:com.google.android.gms:aggregated",
                    "point": []
                }
            ]
        },
[...]
            "dataset": [
                {
                    "dataSourceId": "derived:com.google.activity.summary:com.google.android.gms:aggregated",
                    "point": []
                }
            ]
        }
    ]
}

待解答问题

  • 无活动数据用户的400 Bad Request响应是否可以规避?
  • 该情况是否属于Google Fit API的bug?我们认为按活动段聚合空数据时,理应返回空数据而非400错误,现有响应逻辑不合理。

解答

问题1解答

可以规避,有两种可行方案:

  1. 先对目标用户发起一次轻量的按时间聚合的活动段查询(即你用来验证无数据的请求格式),如果返回全空数据,说明该用户无活动记录,直接跳过按活动段聚合的请求即可;
  2. 给按活动段聚合的请求增加显式的数据源声明,在aggregateBy的每个字段里补充dataSourceId指定为已公开的标准活动段数据源ID,避免API在无数据时动态查找数据源失败。

问题2解答

该情况确实属于Google Fit API的设计缺陷,也就是你所说的bug。
按照REST API的常规设计规范,请求参数合法、仅查询结果为空的场景应当返回200状态码加空数据集,而非参数错误类的400状态码。你遇到的错误本质是API内部的逻辑漏洞:当用户无活动记录时,API内部无法加载对应的聚合数据源,就直接把内部错误包装成了参数错误返回,不符合对外的接口契约。

内容的提问来源于stack exchange,提问作者Thryve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 18:27:03