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解答
可以规避,有两种可行方案:
- 先对目标用户发起一次轻量的按时间聚合的活动段查询(即你用来验证无数据的请求格式),如果返回全空数据,说明该用户无活动记录,直接跳过按活动段聚合的请求即可;
- 给按活动段聚合的请求增加显式的数据源声明,在
aggregateBy的每个字段里补充dataSourceId指定为已公开的标准活动段数据源ID,避免API在无数据时动态查找数据源失败。
问题2解答
该情况确实属于Google Fit API的设计缺陷,也就是你所说的bug。
按照REST API的常规设计规范,请求参数合法、仅查询结果为空的场景应当返回200状态码加空数据集,而非参数错误类的400状态码。你遇到的错误本质是API内部的逻辑漏洞:当用户无活动记录时,API内部无法加载对应的聚合数据源,就直接把内部错误包装成了参数错误返回,不符合对外的接口契约。
内容的提问来源于stack exchange,提问作者Thryve
相关产品推荐
相关产品推荐

