SpaceX-API 实战:使用 `GET /v4/dragons/:id` 获取单个 Dragon 航天器详情
2026/9/23 13:56:03 网站建设 项目流程
  • 后端
  • API设计

【免费下载链接】SpaceX-API

:rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data.

项目地址:https://gitcode.com/gh_mirrors/spa/SpaceX-API
点击查看免费下载

本篇技术指南聚焦开源项目 SpaceX-API 中获取单个 Dragon 航天器(Dragon capsule)详情的 REST 端点GET /v4/dragons/:id,涵盖请求方法、URL 参数、认证要求、完整响应字段逐项解析、404 错误处理,并结合仓库源码(路由实现、Mongoose 模型、Redis 缓存中间件)讲解其底层工作方式。读完本文,你将能够独立调用该端点完成 Dragon 数据检索、按字段理解每一个返回指标,并在此基础上扩展使用查询与分页能力。

端点速览:方法与 URL

Dragon 单条记录查询是 v4 API 中最常用的端点之一,定义在 docs/dragons/v4/one.md 中,其核心契约如下:

项目说明
HTTP 方法GET
请求 URLhttps://api.spacexdata.com/v4/dragons/:id
URL 参数id=[string],即目标 Dragon 记录的 MongoDB ObjectId
认证要求False(无需 API Key)

该端点属于公开只读路由,无需携带任何认证头即可访问。与之对应的完整端点族还包括:

  • GET /v4/dragons—— 获取全部 Dragon,见 docs/dragons/v4/all.md;
  • POST /v4/dragons/query—— 自定义查询与分页,见 docs/dragons/v4/query.md;
  • GET /v4/dragons/:id—— 本文主角,按 ID 取单条记录。

获取 Dragon 的 ID

id是 MongoDB 生成的 24 位十六进制字符串 ObjectId,例如示例中的5e9d058759b1ff74a7ad5f8f。获取 id 的常见方式:

  1. 调用GET /v4/dragons获取全部记录,从返回数组的id字段中挑选目标;
  2. 或使用POST /v4/dragons/queryname等字段筛选后读取docs[].id

实测:一行命令发起请求

由于端点无需认证,你可以直接使用curl或任意 HTTP 客户端调用。以文档示例中的 Dragon 1 为例:

curl https://api.spacexdata.com/v4/dragons/5e9d058759b1ff74a7ad5f8f

若记录存在,服务端返回200 OK与一个完整的 Dragon JSON 对象(字段详解见下一节);若该 id 在集合中不存在,则返回404 NOT FOUND,响应体为纯文本Not Found。这是该端点仅有的两种响应结果,契约非常简洁。

成功响应200 OK:返回字段逐项解析

文档给出了完整的成功响应示例,对应航天器 "Dragon 1"(id: 5e9d058759b1ff74a7ad5f8f)。以下结合 docs/dragons/v4/schema.md 与 models/dragons.js 中的类型定义,逐层拆解每个字段的含义与数据类型。

顶层字段

字段类型含义与说明
nameString(唯一、必填)航天器名称,如Dragon 1;在 Mongoose 模型中声明了unique: truerequired: true
typeString(必填)类型标识,示例值为capsule
activeBoolean(必填)是否仍在役,示例为true
crew_capacityNumber(必填)载员数量,Dragon 1 为0(纯货运)
sidewall_angle_degNumber(必填)侧壁倾角(度),示例为15
orbit_duration_yrNumber(必填)轨道停留时长(年),示例为2
dry_mass_kg/dry_mass_lbNumber(必填)干质量(不含推进剂),公制4200kg / 英制9300lb
first_flightString(默认null首次飞行日期,ISO 8601 格式2010-12-08
flickr_imagesString[]官方图集 URL 列表
wikipediaString维基百科词条链接
descriptionString航天器背景描述文本
idString记录的 ObjectId,示例5e9d058759b1ff74a7ad5f8f

嵌套子对象

字段结构说明
heat_shieldmaterial(String,必填)、size_meters(Number,必填)、temp_degrees(Number)、dev_partner(String)热防护系统:材料(示例PICA-X)、直径(3.6 米)、耐受温度(3000 度)、研发合作方(NASA
launch_payload_masskg(6000)、lb(13228)发射载荷质量(公制/英制)
launch_payload_volcubic_meters(25)、cubic_feet(883)发射载荷体积(公制/英制)
return_payload_masskg(3000)、lb(6614)返回载荷质量
return_payload_volcubic_meters(11)、cubic_feet(388)返回载荷体积
pressurized_capsulepayload_volume.cubic_meters(11)、payload_volume.cubic_feet(388)加压舱段的有效载荷容积
trunktrunk_volume(14 m³ / 494 ft³)、cargo.solar_array(2)、cargo.unpressurized_cargo(true)非加压货舱段(trunk):容积、太阳能电池板数量、是否支持非加压货物
height_w_trunkmeters(7.2)、feet(23.6)含 trunk 的总高度
diametermeters(3.7)、feet(12)舱体直径
thrusters对象数组,含type(Draco)、amount(18)、pods(4)、fuel_1(nitrogen tetroxide)、fuel_2(monomethylhydrazine)、isp(300)、thrust.kN(0.4)、thrust.lbf(90)推进器配置:类型、数量、分组数、双组元推进剂、比冲与单台推力

在数据模型中,thrusters字段被声明为type: mongoose.Mixed(见 models/dragons.js 第 59-61 行),即不限制内部结构,允许如上所示的任意嵌套对象数组;而其余嵌套对象(如heat_shieldtrunk)则定义了严格的子字段类型。id字段由mongoose-id插件自动生成(models/dragons.js 第 157 行),响应中同时保留_idid两种形式。

源码视角:这个端点在后端是如何实现的

路由定义

GET /v4/dragons/:id的路由实现在 routes/dragons/v4/index.js 第 21-28 行:

router.get('/:id', cache(86400), async (ctx) => { const result = await Dragon.findById(ctx.params.id); if (!result) { ctx.throw(404); } ctx.status = 200; ctx.body = result; });

从源码结构可以看到三条关键链路:

  1. 路由前缀:路由注册在prefix: '/(v4|latest)/dragons'下,因此/v4/dragons/:id/latest/dragons/:id均指向同一处理器;
  2. 数据库查询:通过 Mongoose 模型的findById(ctx.params.id)按 ObjectId 精确查找(模型定义见 models/dragons.js);
  3. 404 处理:当查询结果为空时调用ctx.throw(404),Koa 会将其转换为标准的404 Not Found响应——这正是文档 Error Responses 一节所述行为的实现来源。

缓存机制:Dragon 数据缓存 24 小时

注意路由上的cache(86400)中间件。SpaceX-API 使用 Redis 做响应缓存,中间件实现在 middleware/cache.js。对 Dragon 端点而言:

  • 缓存 TTL 为 86400 秒,即24 小时(docs/README.md 的 Caching 一节明确列出 dragons 的缓存时间为 24 小时,与 rockets 同级;而 launches 仅 20 秒);
  • 缓存 key 由method + url + body经 BLAKE3 哈希生成,命中时响应头携带spacex-api-cache: HIT,未命中时携带MISS,并回写缓存;
  • GETPOST请求参与缓存,且只在NODE_ENV=production下生效。

因此对调用方来说,短时间内的重复请求会直接命中 Redis,延迟更低,且可观测到上述响应头。

认证与写操作对照

GET /:id无需认证,但同一路由文件中的写操作(POSTPATCHDELETE,见 routes/dragons/v4/index.js 第 43-71 行)均挂载了authauthz('dragon:create'/'update'/'delete')中间件,需要在请求头携带spacex-keyAPI Key,否则返回401。这也印证了只读检索端点的公开性定位。

错误处理:何时收到404 NOT FOUND

该端点的错误契约非常单一(见 docs/dragons/v4/one.md):

  • 状态码404 NOT FOUND
  • 响应体:纯文本Not Found

触发条件为:传入的id在 Dragon 集合中不存在。常见错误姿势包括:

# id 不存在(记录已删除或 id 拼写错误) curl https://api.spacexdata.com/v4/dragons/5e9d058759b1ff74a7ad5f8f0 # => 404 Not Found # 注意:若 id 格式非法(非 ObjectId),可能由 Mongoose 抛错, # 但按路由实现 findById 对合法格式的查询返回 null 时统一走 404

从实现看,findById在查无记录时返回null,路由随即ctx.throw(404);而一旦命中,ctx.body = result会直接序列化 Mongoose 文档为 JSON 输出。

从单条查询到批量与自定义检索

单条查询返回的完整字段结构,同样适用于 Dragon 端点族的其他能力:

  • 获取全部GET /v4/dragons返回所有 Dragon 的数组,按name升序排列(排序逻辑见 routes/dragons/v4/index.js 第 12 行sort: { name: 'asc' });
  • 自定义查询 + 分页POST /v4/dragons/query支持 MongoDB 查询语法与selectsortlimitpagepopulate等分页选项,返回totalDocshasNextPage等分页元数据,详见 docs/dragons/v4/query.md 与通用指南 docs/queries.md。

例如,若你想在返回结果中只挑选指定字段,可以使用/query端点并在options.select中声明字段投影,从而复用在本文中解析过的字段名:

curl -X POST https://api.spacexdata.com/v4/dragons/query \ -H "Content-Type: application/json" \ -d '{ "query": { "name": "Dragon 1" }, "options": { "select": { "name": 1, "active": 1, "dry_mass_kg": 1 } } }'

小结

GET /v4/dragons/:id是 SpaceX-API 中结构清晰、契约简单的只读端点:无需认证、一条 URL 即返回完整 Dragon 档案,字段覆盖热防护、载荷能力、推进器、结构尺寸等全部维度。理解其背后的 Mongoose 模型 与 路由实现,能帮助你准确解释每一个返回指标;而 24 小时 Redis 缓存的机制(middleware/cache.js)则解释了该端点出色的响应稳定性。需要进阶检索时,可无缝切换到 批量查询 端点,实现对 Dragon 数据的全量、筛选与分页访问。

  • 后端
  • API设计

【免费下载链接】SpaceX-API

:rocket: Open Source REST API for SpaceX launch, rocket, core, capsule, starlink, launchpad, and landing pad data.

项目地址:https://gitcode.com/gh_mirrors/spa/SpaceX-API
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询