跳转至

查询访问数据

1. 接口描述

接口请求路径:POST /prod-api/acdn/tcdn/statistics/describeCdnData

describeCdnData 用于查询指定域名或当前账号全部域名的访问类监控数据,包括请求数、命中率、状态码等。计费流量与带宽请使用 describeBillingData,本接口传入 fluxbandwidth 将返回错误。账号需具备 tcdn:DescribeCdnData 权限。

Token 获取方式见 密钥鉴权

2. 输入参数

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

参数名称 必选 类型 描述
params Params 时间筛选
domains Array of String 加速域名列表,须属于当前账号,单次最多 30 个;不传或空数组表示全部域名。示例值:["lw111.demo.com"]
metric String 访问统计指标,不支持 fluxbandwidth。取值:request(请求数,单位 次)、hitRequest(命中请求数,单位 次)、requestHitRate(请求命中率,单位 %)、hitFlux(命中流量,单位 byte)、fluxHitRate(流量命中率,单位 %)、statusCode(状态码汇总,返回 2xx/3xx/4xx/5xx)、2xx/3xx/4xx/5xx(对应状态码明细),也支持具体状态码如 404。示例值:request
interval String 时间粒度。取值:min(1 分钟,查询区间不超过 24 小时)、5min(5 分钟,查询区间不超过 31 天)、hour(1 小时,查询区间不超过 31 天)、day(天,查询区间大于 31 天)。示例值:5min
area String 加速区域。取值:mainland(中国境内)、overseas(中国境外)。示例值:mainland

3. 输出参数

参数名称 类型 描述
code Integer 状态码。示例值:200
msg String 提示信息。示例值:操作成功
data Object 访问数据响应
data.requestId String 上游请求 ID,定位问题时请提供该值
data.interval String 时间粒度,与请求一致。示例值:5min
data.data [ResourceData] 访问数据明细

4. 示例

示例1 查询请求数

输入示例

{
  "domains": [],
  "metric": "request",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}

代码调用

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

curl -X POST 'https://{登录域名}/prod-api/acdn/tcdn/statistics/describeCdnData' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.xxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "domains": [],
  "metric": "request",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}'
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 DescribeCdnDataTest {

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

        String requestBody = "{"
                + "\"domains\":[],"
                + "\"metric\":\"request\","
                + "\"interval\":\"5min\","
                + "\"area\":\"mainland\","
                + "\"params\":{\"beginTime\":\"2025-10-15 00:00:00\",\"endTime\":\"2025-10-15 23:59:59\"}"
                + "}";

        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/tcdn/statistics/describeCdnData"
    token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"

    requestBody := []byte(`{
  "domains": [],
  "metric": "request",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}`)

    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": {
    "requestId": "6b7a1f77-8a70-4f9a-b6d2-8e7d1b7f6e35",
    "interval": "5min",
    "data": [
      {
        "resource": "all",
        "cdnData": [
          {
            "metric": "request",
            "detailData": [
              { "time": "2025-10-15 00:00:00", "value": 100 },
              { "time": "2025-10-15 00:05:00", "value": 120 }
            ],
            "summarizedData": { "name": "sum", "value": 220 }
          }
        ]
      }
    ]
  }
}

示例2 查询状态码汇总

metricstatusCode 时,cdnData2xx3xx4xx5xx 分组返回。

输入示例

{
  "domains": ["lw111.demo.com"],
  "metric": "statusCode",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}

代码调用

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

curl -X POST 'https://{登录域名}/prod-api/acdn/tcdn/statistics/describeCdnData' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.xxxxxx' \
  -H 'Content-Type: application/json' \
  -d '{
  "domains": ["lw111.demo.com"],
  "metric": "statusCode",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}'
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 DescribeCdnDataStatusCodeTest {

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

        String requestBody = "{"
                + "\"domains\":[\"lw111.demo.com\"],"
                + "\"metric\":\"statusCode\","
                + "\"interval\":\"5min\","
                + "\"area\":\"mainland\","
                + "\"params\":{\"beginTime\":\"2025-10-15 00:00:00\",\"endTime\":\"2025-10-15 23:59:59\"}"
                + "}";

        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/tcdn/statistics/describeCdnData"
    token := "eyJhbGciOiJIUzUxMiJ9.xxxxxx"

    requestBody := []byte(`{
  "domains": ["lw111.demo.com"],
  "metric": "statusCode",
  "interval": "5min",
  "area": "mainland",
  "params": {
    "beginTime": "2025-10-15 00:00:00",
    "endTime": "2025-10-15 23:59:59"
  }
}`)

    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": {
    "requestId": "3c140219-cfe9-470e-b241-907877d6fb03",
    "interval": "5min",
    "data": [
      {
        "resource": "lw111.demo.com",
        "cdnData": [
          {
            "metric": "2xx",
            "detailData": [
              { "time": "2025-10-15 00:00:00", "value": 95 }
            ],
            "summarizedData": { "name": "sum", "value": 95 }
          },
          {
            "metric": "3xx",
            "detailData": [
              { "time": "2025-10-15 00:00:00", "value": 3 }
            ],
            "summarizedData": { "name": "sum", "value": 3 }
          },
          {
            "metric": "4xx",
            "detailData": [
              { "time": "2025-10-15 00:00:00", "value": 2 }
            ],
            "summarizedData": { "name": "sum", "value": 2 }
          },
          {
            "metric": "5xx",
            "detailData": [
              { "time": "2025-10-15 00:00:00", "value": 0 }
            ],
            "summarizedData": { "name": "sum", "value": 0 }
          }
        ]
      }
    ]
  }
}

5. 错误码

HTTP 状态码 / 业务提示 描述
200 成功
401 未鉴权或 Token 无效
403 无权限
无效的请求参数:Metric metric 传入了 fluxbandwidth
error code:{0},message:{1} 上游查询失败,{0} 为错误码,{1} 为原因

6. 数据模型

Params

时间筛选。格式为 yyyy-MM-dd HH:mm:ss

参数名称 必选 类型 描述
beginTime String 开始时间。示例值:2025-10-15 00:00:00
endTime String 结束时间。示例值:2025-10-15 23:59:59

ResourceData

单个资源的访问数据。

参数名称 类型 描述
resource String 资源标识。未指定 domains 时为 all,否则为域名。示例值:all
cdnData [CdnMetricData] 访问指标数据;metricstatusCode 时按状态码分组返回多项

CdnMetricData

单个访问指标的趋势与汇总。

参数名称 类型 描述
metric String 统计指标。statusCode 查询时为 2xx3xx 等。示例值:request
detailData [TimestampData] 按时间粒度排列的明细数据
summarizedData SummarizedData 汇总数据

TimestampData

单个时间点的数据。

参数名称 类型 描述
time String 时间点。示例值:2025-10-15 00:00:00
value Float 数据值,单位随 metric 而定。示例值:100

SummarizedData

查询区间内的汇总数据。

参数名称 类型 描述
name String 汇总方式,如 summax。示例值:sum
value Float 汇总值。示例值:220