射數(shù)據(jù)接口(GET /v4/launches)實戰(zhàn)指南)
后端API設(shè)計【免費下載鏈接】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點擊查看免費下載本篇技術(shù)指南圍繞 SpaceX-API 開源倉庫gh_mirrors/spa/SpaceX-API中 docs/launches/v4/all.md 文檔系統(tǒng)講解 v4 版本“獲取全部發(fā)射記錄Get all launches”接口的請求方式、響應(yīng)結(jié)構(gòu)、字段語義與底層實現(xiàn)。讀完本文你將掌握如何調(diào)用該接口拉取全量發(fā)射數(shù)據(jù)、理解每個返回字段的含義與數(shù)據(jù)類型、了解其與/past、/upcoming、/latest、/next、/query等關(guān)聯(lián)端點的關(guān)系并能結(jié)合源碼理解接口的排序、緩存與數(shù)據(jù)轉(zhuǎn)換機制。接口速覽Get all launches是 v4 版本中最基礎(chǔ)的只讀端點之一一次請求即可返回當(dāng)前數(shù)據(jù)庫中全部發(fā)射記錄每條記錄對應(yīng)一次 SpaceX 發(fā)射任務(wù)例如 CRS-20 貨運補給任務(wù)并按任務(wù)編號flight_number升序排列。項目值請求方法GET請求地址https://api.spacexdata.com/v4/launches認證要求False公開只讀接口無需 API Key成功狀態(tài)碼200 OK返回類型JSON 數(shù)組Array一個最簡單的調(diào)用示例使用curlcurl -X GET https://api.spacexdata.com/v4/launches響應(yīng)是一個以[開頭的 JSON 數(shù)組數(shù)組中的每個元素是一條完整的發(fā)射記錄對象示例以CRS-20任務(wù)flight_number: 91為樣例。響應(yīng)結(jié)構(gòu)詳解成功響應(yīng)狀態(tài)碼為200 OK響應(yīng)體為 JSON 數(shù)組。文檔中給出的完整示例CRS-20Dragon 1 膠囊的最后一班 CRS 任務(wù)如下[ { fairings: null, links: { patch: { small: https://images2.imgbox.com/53/22/dh0XSLXO_o.png, large: https://images2.imgbox.com/15/2b/NAcsTEB6_o.png }, reddit: { campaign: https://www.reddit.com/r/spacex/comments/ezn6n0/crs20_launch_campaign_thread, launch: https://www.reddit.com/r/spacex/comments/fe8pcj/rspacex_crs20_official_launch_discussion_updates/, media: https://www.reddit.com/r/spacex/comments/fes64p/rspacex_crs20_media_thread_videos_images_gifs/, recovery: null }, flickr: { small: [], original: [ https://live.staticflickr.com/65535/49635401403_96f9c322dc_o.jpg, https://live.staticflickr.com/65535/49636202657_e81210a3ca_o.jpg, https://live.staticflickr.com/65535/49636202572_8831c5a917_o.jpg, https://live.staticflickr.com/65535/49635401423_e0bef3e82f_o.jpg, https://live.staticflickr.com/65535/49635985086_660be7062f_o.jpg ] }, presskit: https://www.spacex.com/sites/spacex/files/crs-20_mission_press_kit.pdf, webcast: https://youtu.be/1MkcWK2PnsU, youtube_id: 1MkcWK2PnsU, article: https://spaceflightnow.com/2020/03/07/late-night-launch-of-spacex-cargo-ship-marks-end-of-an-era/, wikipedia: https://en.wikipedia.org/wiki/SpaceX_CRS-20 }, static_fire_date_utc: 2020-03-01T10:20:00.000Z, static_fire_date_unix: 1583058000, tdb: false, net: false, window: 0, rocket: 5e9d0d95eda69973a809d1ec, success: true, failures: [], details: SpaceXs 20th and final Crew Resupply Mission under the original NASA CRS contract, this mission brings essential supplies to the International Space Station using SpaceXs reusable Dragon spacecraft. It is the last scheduled flight of a Dragon 1 capsule. (CRS-21 and up under the new Commercial Resupply Services 2 contract will use Dragon 2.) The external payload for this mission is the Bartolomeo ISS external payload hosting platform. Falcon 9 and Dragon will launch from SLC-40, Cape Canaveral Air Force Station and the booster will land at LZ-1. The mission will be complete with return and recovery of the Dragon capsule and down cargo., crew: [], ships: [], capsules: [ 5e9e2c5cf359185d753b266f ], payloads: [ 5eb0e4d0b6c3bb0006eeb253 ], launchpad: 5e9e4501f509094ba4566f84, auto_update: true, flight_number: 91, name: CRS-20, date_utc: 2020-03-07T04:50:31.000Z, date_unix: 1583556631, date_local: 2020-03-06T23:50:31-05:00, date_precision: hour, upcoming: false, cores: [ { core: 5e9e28a7f359187afd3b2662, flight: 2, gridfins: true, legs: true, reused: true, landing_attempt: true, landing_success: true, landing_type: RTLS, landpad: 5e9e3032383ecb267a34e7c7 } ], id: 5eb87d42ffd86e000604b384 }, ... ]該數(shù)組未做分頁限制會一次性返回全部歷史與已計劃發(fā)射記錄對于需要按條件篩選、分頁或聚合的場景請改用POST /v4/launches/query詳見后文“關(guān)聯(lián)端點”一節(jié)。字段語義與數(shù)據(jù)類型對照倉庫中 models/launches.js 的 Mongoose Schema其完整 JSON 化描述見 docs/launches/v4/schema.md逐字段說明如下標識與編號字段類型說明idString (ObjectId)該發(fā)射記錄在數(shù)據(jù)庫中的唯一 ID例如5eb87d42ffd86e000604b384flight_numberNumber任務(wù)編號必填文檔示例中 CRS-20 為91同時該字段是默認排序鍵nameString任務(wù)名稱唯一且必填例如CRS-20日期與時間字段類型說明date_utcStringUTC 時間字符串例如2020-03-07T04:50:31.000Z必填date_unixNumberUnix 時間戳秒例如1583556631必填date_localString本地時區(qū)時間字符串例如2020-03-06T23:50:31-05:00必填date_precisionString日期精度枚舉值限定為half、quarter、year、month、day、hour六種文檔示例為hourstatic_fire_date_utcString / null靜態(tài)點火測試時間UTC默認nullstatic_fire_date_unixNumber / null靜態(tài)點火測試時間戳默認null提示date_unix單位為秒而非毫秒在 JavaScript 中需* 1000后再傳入new Date()。狀態(tài)標志字段類型說明upcomingBoolean是否為計劃中未執(zhí)行的任務(wù)必填successBoolean / null是否成功默認null未執(zhí)行或無定論時為 nulltdbBoolean是否為“待定時間”To Be Determined默認falsenetBoolean是否使用“網(wǎng)絡(luò)估算時間”Not Earlier Than默認falsewindowNumber / null發(fā)射窗口長度秒默認null文檔示例中 CRS-20 為0auto_updateBoolean是否由系統(tǒng)自動從數(shù)據(jù)源更新默認true任務(wù)信息與結(jié)果字段類型說明detailsString / null任務(wù)詳情描述文本默認null文檔示例包含 CRS-20 的完整任務(wù)背景failuresArray失敗記錄數(shù)組每項包含timeNumber故障發(fā)生時間秒數(shù)、altitudeNumber故障高度、reasonString故障原因無故障時為空數(shù)組[]fairingsObject / null整流罩信息含reused、recovery_attempt、recovered均為 Boolean / null與shipsShip ID 數(shù)組無法回收或信息缺失時為null關(guān)聯(lián)引用UUID 風(fēng)格 ID這些字段存儲的是指向其他集合文檔的 ID 引用屬于典型的“外鍵”式設(shè)計字段類型引用集合rocketObjectId / nullrocketslaunchpadObjectId / nulllaunchpadsshipsArrayshipscapsulesArraycapsulespayloadsArraypayloadscrewArraycrewcoresArray內(nèi)嵌子文檔指向 cores詳見下文cores為內(nèi)嵌數(shù)組每個元素包含字段類型說明coreObjectId / null助推器核心 IDflightNumber / null該核心的復(fù)用飛行次數(shù)示例中為2gridfinsBoolean / null是否使用柵格翼legsBoolean / null是否使用著陸腿reusedBoolean / null是否復(fù)用landing_attemptBoolean / null是否嘗試著陸landing_successBoolean / null著陸是否成功landing_typeString / null著陸方式示例為RTLSReturn To Launch Site返回發(fā)射場其他常見值如ASDS海上無人船landpadObjectId / null著陸平臺 ID媒體鏈接links對象包含該次任務(wù)的全部媒體資源均默認為null或空數(shù)組字段類型說明patchObject任務(wù)徽章small/large兩張圖片 URLredditObjectReddit 相關(guān)帖campaign、launch、media、recoveryflickrObjectFlickr 相冊small、original兩個圖片 URL 數(shù)組presskitString / null官方新聞發(fā)布稿 PDF 鏈接webcastString / null發(fā)射直播回放鏈接youtube_idString / nullYouTube 視頻 IDarticleString / null任務(wù)相關(guān)新聞文章鏈接wikipediaString / null任務(wù)維基百科頁面鏈接底層實現(xiàn)路由、排序與響應(yīng)轉(zhuǎn)換該端點在倉庫中的實際路由定義位于 routes/launches/v4/index.js核心處理邏輯為// Get all launches router.get(/, cache(20), async (ctx) { try { const result await Launch.find({}, null, { sort: { flight_number: asc, }, }); ctx.status 200; ctx.body await transformResponse(result); } catch (error) { ctx.throw(400, error.message); } });從源碼結(jié)構(gòu)可以梳理出三條關(guān)鍵事實默認排序查詢不帶任何過濾條件{}但顯式指定sort: { flight_number: asc }因此全量接口的返回順序始終按任務(wù)編號從小到大排列。響應(yīng)轉(zhuǎn)換結(jié)果會先經(jīng)過transformResponse實現(xiàn)在 routes/launches/v4/_transform-response.js處理。該函數(shù)對數(shù)組、分頁對象、單文檔三種形態(tài)分別處理核心作用是把內(nèi)嵌的crew子文檔中的crew引用對象解包為直接的 crew 引用對應(yīng) v5 的crew.crew結(jié)構(gòu)調(diào)整使 v4 響應(yīng)中的crew字段保持為 ID 數(shù)組形態(tài)。錯誤處理任何查詢異常都會以400 Bad Request返回并攜帶 Mongoose 的錯誤信息。路由前綴通過new Router({ prefix: /v4/launches })聲明因此GET /v4/launches正是上述處理器所有 v4 launches 路由含/past、/upcoming、/latest、/next、/:id、/query統(tǒng)一在該文件內(nèi)注冊并在 routes/launches/index.js 中與 v5 路由一并導(dǎo)出掛載。緩存機制全量接口使用了 20 秒的 Redis 緩存中間件cache(20)。緩存實現(xiàn)在 middleware/cache.js要點如下僅在生產(chǎn)環(huán)境NODE_ENV production且 Redis 可用時啟用緩存緩存鍵由method url body經(jīng) BLAKE3 哈希生成如spacex-cache:hash命中緩存時響應(yīng)頭帶spacex-api-cache: HIT未命中為MISS同時設(shè)置Cache-Control: max-age20與spacex-api-cache-online狀態(tài)頭僅GET與POST方法可被緩存TTL 由中間件參數(shù)此處為 20 秒決定。因此同一秒內(nèi)的重復(fù)請求會直接由 Redis 返回緩存結(jié)果這是公共公開接口控制負載的主要手段。關(guān)聯(lián)端點速查/v4/launches全量接口是整個 launches 模塊的入口倉庫在 routes/launches/v4/index.js 中還提供了若干“便捷端點”Convenience Endpoints與標準端點端點方法說明對應(yīng)文檔/v4/launches/pastGET已執(zhí)行發(fā)射按flight_number升序過濾條件upcoming: falsedocs/launches/v4/past.md/v4/launches/upcomingGET計劃中發(fā)射過濾條件upcoming: truedocs/launches/v4/upcoming.md/v4/launches/latestGET最近一次已執(zhí)行發(fā)射upcoming: false中flight_number降序取首條docs/launches/v4/latest.md/v4/launches/nextGET下一次計劃發(fā)射upcoming: true中flight_number升序取首條docs/launches/v4/next.md/v4/launches/:idGET按 ID 獲取單條發(fā)射記錄不存在時返回404 Not Founddocs/launches/v4/one.md/v4/launches/queryPOST結(jié)構(gòu)化查詢與分頁query/options雙字段體docs/launches/v4/query.md用 Query 端點替代全量拉取當(dāng)全量接口返回數(shù)據(jù)過大時應(yīng)改用POST /v4/launches/query。該端點基于mongoose-paginate-v2實現(xiàn)見 docs/queries.md請求體為{ query: {}, options: {} }其中query接受任意合法的 MongoDB find() 查詢條件options常用參數(shù)包括select選擇返回字段、sort排序、page/offset分頁、limit每頁條數(shù)、pagination設(shè)為false時返回全部文檔、populate聯(lián)表填充。例如按日期區(qū)間查詢{ query: { date_utc: { $gte: 2017-06-22T00:00:00.000Z, $lte: 2017-06-25T00:00:00.000Z } } }由于launchSchema在 models/launches.js 中為name、details建立了text全文索引還可以直接使用$text進行全文搜索{ query: { $text: { $search: crs } } }查詢端點返回分頁結(jié)構(gòu)包含docs、totalDocs、totalPages、hasPrevPage、hasNextPage等元數(shù)據(jù)字段便于前端分頁渲染。引用填充populate響應(yīng)中的rocket、payloads、capsules等字段均為 ID 引用。若需要直接在響應(yīng)中嵌入被引用的完整文檔可在 query 端點中使用populate{ query: {}, options: { populate: [payloads] } }也可以嵌套填充并選擇性返回字段如僅取載荷的name具體示例可參閱 docs/queries.md 的 Populate 章節(jié)。注意v4 路由在查詢時還會經(jīng)過 routes/launches/v4/_transform-query.js將populate中的crew路徑重寫為crew.crew以適配內(nèi)部 schema 結(jié)構(gòu)這是 v4 兼容 v5 數(shù)據(jù)模型的關(guān)鍵轉(zhuǎn)換。v4 與 v5 的差異如需了解該接口在 v5 版本中的演進可參考 docs/launches/v5/README.mdv4 到 v5 的主要變化是crew字段由“ID 數(shù)組”演變?yōu)椤鞍巧畔⒌膶ο髷?shù)組”以便為每次發(fā)射中的每位乘員攜帶更多數(shù)據(jù)。v5 各端點文檔位于 docs/launches/v5/ 目錄all.md、one.md、query.md等兩者在響應(yīng)轉(zhuǎn)換與查詢轉(zhuǎn)換層分別做了兼容處理。小結(jié)與建議GET /v4/launches是獲取 SpaceX 全量發(fā)射數(shù)據(jù)最直接的入口返回按flight_number升序排列的完整發(fā)射記錄數(shù)組無需認證即可調(diào)用。實際開發(fā)中的使用建議全量數(shù)據(jù)同步適合定時任務(wù)、數(shù)據(jù)倉庫初始化等低頻場景配合date_unix與flight_number做增量更新按需篩選優(yōu)先使用POST /v4/launches/query配合query條件、select裁剪字段與populate聯(lián)表填充減少傳輸體積關(guān)注緩存頭生產(chǎn)環(huán)境響應(yīng)帶Cache-Control: max-age20與spacex-api-cache頭可據(jù)此設(shè)計客戶端緩存策略區(qū)分版本v4 的crew為 ID 數(shù)組v5 為對象數(shù)組消費端需按版本解析。相關(guān)源碼與文檔索引路由實現(xiàn) routes/launches/v4/index.js、數(shù)據(jù)模型 models/launches.js、Schema 文檔 docs/launches/v4/schema.md、查詢指南 docs/queries.md、緩存中間件 middleware/cache.js。贊分享后端API設(shè)計【免費下載鏈接】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點擊查看免費下載相關(guān)推薦SpaceX-API v4 最新發(fā)射接口GET /v4/launches/latest使用指南與源碼解析SpaceX API v4 最新發(fā)射接口GET /v4/launches/latest使用指南與源碼解析 本篇技術(shù)指南圍繞 SpaceX API 倉庫中 d后端API設(shè)計SpaceX-API v4 歷史發(fā)射數(shù)據(jù)指南GET /v4/launches/past 端點深度解析SpaceX API v4 歷史發(fā)射數(shù)據(jù)指南GET /v4/launches/past 端點深度解析 本文是 SpaceX API開源 REST API f后端API設(shè)計SpaceX-API 實戰(zhàn)指南使用 v5 Launches 接口獲取全部發(fā)射記錄GET /v5/launchesSpaceX API 實戰(zhàn)指南使用 v5 Launches 接口獲取全部發(fā)射記錄GET /v5/launches 導(dǎo)讀本文圍繞 SpaceX API 開后端API設(shè)計創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考