跳转至

查询访问数据

1. 接口描述

接口请求路径:POST /prod-api/acdn/ccdn/statisticsRest/describeRequestData

describeRequestData 用于查询指定主域名的访问统计数据,对应控制台「数据分析」页面:总流量、总请求数、总访客数汇总卡片,流量、请求数、访客数三条时间趋势,以及按客户端 IP、主机、路径、状态码等维度的 TopN 排行。账号需具备 ccdn:analysis:traffic 权限。

Token 获取方式见 密钥鉴权。

注意:

  • zoneIds 必须为当前账号下的域名,一次最多查询 10 个。
  • 只能查询最近 60 天的数据,单次时间跨度不超过 31 天。

2. 输入参数

以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见 公共请求参数。

参数名称 必选 类型 描述
zoneIds 是 Array of String 域名 Zone ID 列表,最多 10 个。示例值:["551290393816e70c5e9765ca020e30a4"]
params 是 Object 时间范围
params.beginTime 是 String 开始时间,格式 yyyy-MM-dd HH:mm:ss,只能查询最近 60 天。示例值:2026-11-06 00:00:00
params.endTime 是 String 结束时间,格式 yyyy-MM-dd HH:mm:ss,与开始时间跨度不超过 31 天。示例值:2026-11-07 00:00:00
action 是 Array of Action 查询指标列表
interval 否 String 时间粒度。取值:1m(1 分钟)、5m(5 分钟)、1h(1 小时)、1d(1 天)。不传时按时间跨度自动选择:跨度 1 天内为 1m,8 天内为 5m,15 天内为 1h,其余为 1d。示例值:1h
mostDimension 否 String 维度排行排序依据,对应界面排行的「请求数 / 流量」切换。取值:requestCount(按请求数,默认)、trafficSum(按流量)。示例值:trafficSum
otherFilter 否 Array of OtherFilter 附属筛选条件

3. 输出参数

data 为指标结果列表,与请求的 action 对应,各元素 list 的结构随 metricName 不同,见 数据模型。

参数名称 类型 描述
code Integer 状态码。示例值:200
msg String 提示信息。示例值:成功
data Array 指标结果列表
data[].metricName String 指标名,与请求一致
data[].list Array 结果列表

4. 示例

示例1 查询访问趋势、汇总及主机排行

输入示例

{
  "zoneIds": ["551290393816e70c5e9765ca020e30a4"],
  "params": {
    "beginTime": "2026-11-06 00:00:00",
    "endTime": "2026-11-07 00:00:00"
  },
  "action": [
    { "metricName": "access" },
    { "metricName": "totalData" },
    { "metricName": "CLIENT_REQUEST_HTTP_HOST", "limit": 5 }
  ],
  "interval": "1h",
  "mostDimension": "trafficSum"
}

代码调用

请将 {登录域名}、token 替换为实际值。

curl -X POST 'https://{登录域名}/prod-api/acdn/ccdn/statisticsRest/describeRequestData' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.xxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "zoneIds": ["551290393816e70c5e9765ca020e30a4"],
  "params": {
    "beginTime": "2026-11-06 00:00:00",
    "endTime": "2026-11-07 00:00:00"
  },
  "action": [
    { "metricName": "access" },
    { "metricName": "totalData" },
    { "metricName": "CLIENT_REQUEST_HTTP_HOST", "limit": 5 }
  ],
  "interval": "1h",
  "mostDimension": "trafficSum"
}'
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class DescribeRequestDataTest {

    public static void main(String[] args) throws Exception {
        String url = "https://{登录域名}/prod-api/acdn/ccdn/statisticsRest/describeRequestData";
        String token = "eyJhbGciOiJIUzUxMiJ9.xxxxxx";

        String requestBody = "{"
                + "\"zoneIds\":[\"551290393816e70c5e9765ca020e30a4\"],"
                + "\"params\":{\"beginTime\":\"2026-11-06 00:00:00\",\"endTime\":\"2026-11-07 00:00:00\"},"
                + "\"action\":["
                + "{\"metricName\":\"access\"},"
                + "{\"metricName\":\"totalData\"},"
                + "{\"metricName\":\"CLIENT_REQUEST_HTTP_HOST\",\"limit\":5}"
                + "],"
                + "\"interval\":\"1h\","
                + "\"mostDimension\":\"trafficSum\""
                + "}";

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost httpPost = new HttpPost(url);
            httpPost.setHeader("Authorization", "Bearer " + token);
            httpPost.setEntity(new StringEntity(requestBody, ContentType.APPLICATION_JSON));

            try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
                int statusCode = response.getStatusLine().getStatusCode();
                String body = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("Status Code: " + statusCode);
                System.out.println("Body: " + body);
            }
        }
    }
}
package main

import (
    "bytes"
    "fmt"
    "io"
    "net/http"
)

func main() {
    url := "https://{登录域名}/prod-api/acdn/ccdn/statisticsRest/describeRequestData"
    token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"

    requestBody := []byte(`{
  "zoneIds": ["551290393816e70c5e9765ca020e30a4"],
  "params": {
    "beginTime": "2026-11-06 00:00:00",
    "endTime": "2026-11-07 00:00:00"
  },
  "action": [
    { "metricName": "access" },
    { "metricName": "totalData" },
    { "metricName": "CLIENT_REQUEST_HTTP_HOST", "limit": 5 }
  ],
  "interval": "1h",
  "mostDimension": "trafficSum"
}`)

    req, err := http.NewRequest(http.MethodPost, url, bytes.NewReader(requestBody))
    if err != nil {
        panic(err)
    }
    req.Header.Set("Authorization", "Bearer "+token)
    req.Header.Set("Content-Type", "application/json")

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, err := io.ReadAll(resp.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println("Status Code:", resp.StatusCode)
    fmt.Println("Body:", string(body))
}

输出示例

{
  "msg": "成功",
  "code": 200,
  "data": [
    {
      "metricName": "access",
      "list": [
        {
          "dateTime": "2026-11-06T00:00:00Z",
          "count": 1250,
          "sum": {
            "edgeResponseBytes": 52428800,
            "visits": 980
          }
        }
      ]
    },
    {
      "metricName": "totalData",
      "list": [
        {
          "count": 30120,
          "sum": {
            "edgeResponseBytes": 1288490188,
            "visits": 22010
          }
        }
      ]
    },
    {
      "metricName": "CLIENT_REQUEST_HTTP_HOST",
      "list": [
        {
          "dimensions": {
            "clientRequestHTTPHost": "www.example.com"
          },
          "name": "www.example.com",
          "count": 18200,
          "sum": {
            "edgeResponseBytes": 805306368
          }
        }
      ]
    }
  ]
}

5. 错误码

查询失败时,code 为 500,原因在 msg,没有 data。

HTTP 状态码 / 业务提示 描述
200 成功
401 未鉴权或 Token 无效
403 无权限,需具备 ccdn:analysis:traffic
请选择时间范围 未传 params,或未传 beginTime、endTime
请至少选择一个域名 未传 zoneIds 或为空
无效的zoneId zoneIds 中存在不属于当前账号的域名
只能查询最近60天的数据 开始时间早于 60 天前
一次只能查询31天的数据 时间跨度超过 31 天
一次只能查询10个域名数据 zoneIds 超过 10 个
无效的interval interval 取值不合法
附属查询条件的条件类型有误 otherFilter[].twoVal 不是 eq、ne
附属查询条件的值不能为空 otherFilter[].threeVal 为空
附属查询条件的值有误 数值类筛选字段的值不是数字

6. 数据模型

Action

查询指标。

参数名称 必选 类型 描述
metricName 是 String 指标。access(时间趋势)、totalData(汇总),或维度字段:CLIENT_IP(客户端 IP)、CLIENT_REQUEST_HTTP_HOST(主机)、CLIENT_REQUEST_PATH(路径)、EDGE_RESPONSE_STATUS(状态码)、ORIGIN_ASN(源 ASN)、ORIGIN_IP(源 IP)、CLIENT_COUNTRY_NAME(国家/地区)、USER_AGENT_BROWSER(浏览器)、USER_AGENT_OS(操作系统)、CLIENT_SSL_PROTOCOL(SSL 协议)。示例值:access
limit 否 Integer 排行返回条数,对应界面 TopN 档位 5、10、15、30。维度字段必填;access、totalData 无需传递。示例值:5

OtherFilter

附属筛选条件。

参数名称 必选 类型 描述
oneVal 是 String 筛选字段,取值同维度 metricName。示例值:CLIENT_COUNTRY_NAME
twoVal 是 String 条件,对应界面的「筛选」与「排除」。取值:eq(等于,筛选)、ne(不等于,排除)。示例值:eq
threeVal 是 Array of String 筛选值,仅使用第一个元素。CLIENT_IP 如 ["1.1.1.1"],CLIENT_COUNTRY_NAME 为国家代码如 ["CN"];数值类字段(EDGE_RESPONSE_STATUS、ORIGIN_ASN)须为数字。示例值:["CN"]

结果项

data[].list 元素结构随 metricName 不同:

  • access:按时间升序的完整时间序列,无数据的时间点各项为 0。count、sum.edgeResponseBytes、sum.visits 分别对应界面的请求数、流量、访客数三条趋势。
参数名称 类型 描述
dateTime String 时间点(UTC)。示例值:2026-11-06T00:00:00Z
count Long 请求数(请求数趋势)。示例值:1250
sum.edgeResponseBytes Number 流量,单位字节(流量趋势)。示例值:52428800
sum.visits Long 访客数(访客数趋势)。示例值:980
  • totalData:时间范围内的汇总,固定一条,对应界面的总请求数、总流量、总访客数汇总卡片。
参数名称 类型 描述
count Long 总请求数。示例值:30120
sum.edgeResponseBytes Number 总流量,单位字节。示例值:1288490188
sum.visits Long 总访客数。示例值:22010
  • 维度字段:按 mostDimension 排序的 TopN 排行列表。
参数名称 类型 描述
dimensions Object 维度值,键为对应上游字段名。示例值:{"clientRequestHTTPHost": "www.example.com"}
name String 维度值,同 dimensions 中的值。示例值:www.example.com
count Long 请求数。示例值:18200
sum.edgeResponseBytes Number 流量(字节)。示例值:805306368