目录
目录(Catalog)
目录
目录资源提供实例范围的参考数据——即客户端用来填充下拉菜单、或在发送写请求之前校验输入的取值列表。它是唯一完全不暴露用户数据的资源:对实例上的每个令牌来说,它返回的一切都完全相同。
- 基础路径:
/api/v2/catalog - 作用域: 无——任何有效令牌都可以读取它
- 起始版本: 3.2.0
注意
请先阅读 API v2 概览,了解认证、响应封装与错误码。
警告:Wavelog 并非这些数据的权威来源
dxcc和subdivisions两个主题提供的是公开可得的参考数据——DXCC 实体列表和 ADIF 分区列表。Wavelog 只是把它镜像过来,方便那些本来就在与 API 通信的客户端:否则它还得再找第二个数据源,只为填充一个下拉菜单。除此之外,Wavelog 还会用自己的信息丰富这些镜像列表——分区、坐标以及源列表并不承载的类似补充——因此响应也不是任何官方列表的逐字段副本。
所以你拿到的是一份副本,其新鲜程度只等同于实例上一次国家文件更新的时间——每个实例按自己的节奏更新,因此两个实例之间可能不一致。只要你的应用需要可靠的数据——奖项核对、公开资料、任何用户会据此行事的内容——请从官方来源(ARRL DXCC 列表和 ADIF 规范)获取,而不是从某个 Wavelog 实例获取。
无需作用域
与令牌(whoami)资源一样,目录需要一个有效令牌,但不需要特定作用域。没有 catalog:read 可以授予——该作用域并不存在,也永远不会出现在令牌对话框中。一个只带 qso:read 铸造的令牌仍然可以读取比赛目录。
理由是:作用域保护的是你的数据,而这里根本没有这样的数据。比赛目录就是比赛模块向实例上所有用户显示的那份列表,给它加上门禁只会迫使每个客户端去请求一个永远不会被拒绝的作用域。
该资源是只读的。POST、PATCH 和 DELETE 会返回 405 method_not_allowed,并带有 Allow: GET。
主题
?topic= 参数用于选择一份列表。不带主题调用时,端点会枚举它已有的主题,这样客户端就能自行发现,而不必把名称硬编码:
curl "https://<WAVELOG_URL>/index.php/api/v2/catalog" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": { "topics": ["contest", "dxcc", "subdivisions"] }
}
未知主题会返回 400 validation_error,并在 error.details.allowed 中给出有效名称。
| 主题 | 返回 | 参数 | 起始版本 |
|---|---|---|---|
contest |
当前启用的比赛目录 | — | 3.2.0 |
dxcc |
当前有效的 DXCC 实体 | order=name\|prefix(可选) |
3.2.0 |
subdivisions |
某一个 DXCC 实体的一级行政区划 | dxcc=<entity number>(必填) |
3.2.0 |
主题:contest
比赛模块所提供的比赛,也就是比赛资源在创建或更新会话时接受的取值:
curl "https://<WAVELOG_URL>/index.php/api/v2/catalog?topic=contest" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": [
{
"id": 1,
"contest": "DARC-WAG",
"name": "Worked All Germany Contest"
},
{
"id": 57,
"contest": "CQ-WW-SSB",
"name": "CQ Worldwide DX Contest, SSB"
}
],
"meta": {
"topic": "contest"
}
}
| 字段 | 含义 |
|---|---|
contest |
ADIF 比赛名称——在 比赛 → 比赛管理 中作为 ADIF Name 维护,也是向比赛写请求中作为 contest 发送的取值 |
name |
便于阅读的名称,用于显示 |
id |
目录 id;实例本地,见下方警告 |
contest 取值就是 ADIF 规范所称的 CONTEST_ID——不要与本 API 中数字形式的 contest_id 混淆。比赛页面把这三个名称相互对照。
警告:用
contest而不是id来定位比赛目录 id 是按实例分配的——id
42在另一台 Wavelog 上是另一场比赛。在实例之间同步的客户端必须以 ADIF 名称作为键。之所以仍然包含 id,只是因为比赛资源把它作为单实例场景下的替代方案接受contest_id。
只列出启用中的比赛。停用的比赛在写入时本来就会被比赛资源拒绝,所以它只会是客户端能看见却永远用不上的取值。仍然引用已停用比赛的会话,会继续在会话对象的 contest / contest_name 字段中报告它的名称,因此不会有任何内容变得不可读。
顺序与比赛模块自身一致:先是通用的兜底条目,然后按名称字母顺序排列。
主题:dxcc
当前有效的 DXCC 实体——已删除的实体和 0 实体不会列出。可用它填充实体下拉菜单,例如在台站档案表单中:
curl "https://<WAVELOG_URL>/index.php/api/v2/catalog?topic=dxcc" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": [
{
"adif": 287,
"name": "SWITZERLAND",
"prefix": "HB",
"continent": "EU",
"cqz": 14,
"ituz": 28,
"lat": 47,
"long": 7.5
}
],
"meta": {
"topic": "dxcc"
}
}
| 字段 | 含义 |
|---|---|
adif |
ADIF 实体编号——台站资源作为 dxcc 期望的取值 |
name |
DXCC 模块所维护的实体名称 |
prefix |
该实体的主前缀 |
continent |
大洲缩写(EU、NA、AS 等) |
cqz / ituz |
该实体的默认 CQ 分区和 ITU 分区 |
lat / long |
参考坐标,十进制度;long 向东为正 |
默认按 name 排序。传入 ?order=prefix 可改为按主前缀排序;其他任何取值都会返回 400 validation_error,并在 error.details.allowed 中给出可接受的取值。
cqz、ituz、lat 和 long 是整个实体的参考值,而不是某个具体台站的。位于大实体内的台站完全可能处在不同分区——如需按呼号解析,请使用查询资源,它会评估实际前缀。
注意(尽可能使用官方来源)
DXCC 数据是公开的,Wavelog 在此提供它纯粹是为了方便,客户端不必自带一份副本。但没有任何东西能保证这个实例运行的是最新的 DXCC 更新。
主题:subdivisions
某一个 DXCC 实体的一级行政区划(ADIF STATE),通过必填的 dxcc 参数选择:
curl "https://<WAVELOG_URL>/index.php/api/v2/catalog?topic=subdivisions&dxcc=287" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": [
{ "state": "AG", "name": "Aargau" },
{ "state": "AI", "name": "Appenzell Innerrhoden" },
{ "state": "AR", "name": "Appenzell Ausserrhoden" }
],
"meta": {
"topic": "subdivisions"
}
}
| 字段 | 含义 |
|---|---|
state |
ADIF 分区代码——QSO 资源在 state 中期望的取值 |
name |
便于阅读的分区名称,用于显示 |
缺少 dxcc 或 dxcc 不是数字时返回 400 validation_error。本身没有分区数据的实体会返回空列表而不是错误——大多数实体都没有。如果还需要实体的名称或分区,请把此主题与 dxcc 主题配合使用。
只列出当前有效的分区。已弃用的分区在 Wavelog 中依然存在,以便旧 QSO 继续显示它记录时所用的分区代码,但对客户端创建的任何内容来说它们都不是有效选项,因此目录把它们排除在外。
添加主题
主题注册在 Catalog_resource::index() 内的一个映射表中。更多列表——波段、模式、传播模式——都可以在那里添加,既不需要新路由,也不需要新作用域:已经在轮询 /api/v2/catalog 的客户端会通过主题列表发现它们。