用 Node.js 调用 Booking.com API 获取酒店数据:从安装到缓存、合规一次搞定!

作者:API传播员 · 2025-11-12 · 阅读时间:6分钟

Booking.com API 仅向商业合作伙伴开放,个人/小规模项目需先通过官方合作通道申请权限。
本文假设你已拿到 BOOKING_API_KEY,我们以沙箱环境为例,完整走通「安装 → 请求 → 缓存 → 合规」全流程,并赠送 AI 提效外挂,复制即可跑!🚀


一. 安装必备依赖📦

npm install axios dotenv node-cache
用途
axios 发送 HTTP 请求
dotenv 安全加载环境变量
node-cache 内存缓存,减少重复调用

二. 环境变量与目录结构🔐

project/
├─ .env # 绝不提交到 Git!
├─ src/
│ ├─ booking.js # API 逻辑模块
│ ├─ cache.js # 缓存封装
│ └─ index.js # 入口
└─ package.json

.env 示例:

BOOKING_API_KEY=your_sandbox_key_here
BASE_URL=https://distribution-xml.booking.com/2.4
CACHE_TTL=300

三. 构造请求 + 代码模块化🛠️

官方文档要求:必须携带 Authorization: Bearer <key>User-Agent 含公司名。

src/booking.js

require('dotenv').config();
const axios = require('axios');
const cache = require('./cache');

const instance = axios.create({
  baseURL: process.env.BASE_URL,
  timeout: 8000,
  headers: {
    'Authorization': Bearer ${process.env.BOOKING_API_KEY},
    'User-Agent': 'YourCompany/1.0 (+https://yourcompany.com)',
    'Accept-Encoding': 'gzip',
    'Accept': 'application/json'
  }
});

/** 获取城市酒店列表
 * @param {string} city  - 城市英文名
 * @param {string} inDate - YYYY-MM-DD
 * @param {string} outDate- YYYY-MM-DD
 * @param {number} guests- 成人数量
 */
async function fetchHotelData(city, inDate, outDate, guests = 2) {
  const cacheKey = hotels:${city}:${inDate}:${outDate}:${guests};
  if (cache.has(cacheKey)) return cache.get(cacheKey);

  const { data } = await instance.get('/json/hotels', {
    params: { city, checkin: inDate, checkout: outDate, guests }
  });

  // 只保留前端需要的字段,减少传输体积
  const slim = data.result.map(h => ({
    hotel_id: h.hotel_id,
    name: h.name,
    address: h.address,
    price: h.min_price?.price || 0,
    currency: h.min_price?.currency || 'USD'
  }));

  cache.set(cacheKey, slim);
  return slim;
}

module.exports = { fetchHotelData };

四. 缓存封装⚡️

src/cache.js

const NodeCache = require('node-cache');
const cache = new NodeCache({ stdTTL: Number(process.env.CACHE_TTL) });
module.exports = cache;

缓存命中率 ≥60%,即可把平均响应时间从 1.2s → 0.2s
想自动分析缓存收益?用 代码优化 一键生成「命中-失效率」日志报表。


五. 错误处理 & 日志🩺

const pino = require('pino')();
const { fetchHotelData } = require('./src/booking');

(async ()=>{
  try {
    const hotels = await fetchHotelData('New York', '2025-08-01', '2025-08-03');
    pino.info({ count: hotels.length }, 'Hotels fetched');
  } catch (err) {
    // 统一错误格式
    if (err.response?.status === 404) {
      pino.warn({ city: 'New York' }, 'City not found in inventory');
    } else if (err.response?.status === 429) {
      pino.error('Rate limit hit, backing off...');
      // TODO: 指数退避
    } else {
      pino.error(err.message);
    }
  }
})();

六. 限速 & 重试机制🚦

Booking.com 对沙箱限 100 req/min,生产更高。
使用 axios-retry 自动退避:

npm install axios-retry

booking.js 顶部追加:

const axiosRetry = require('axios-retry');
axiosRetry(instance, {
  retries: 3,
  retryDelay: axiosRetry.exponentialDelay,
  retryCondition: (err) => err.response?.status >= 429
});

七. 合规性 & 文档📄

  1. 合法用途 – 仅用于获批的商业场景,禁止爬取做竞品数据库
  2. 隐私 – 不得存储客人信用卡信息(PCI DSS)
  3. User-Agent – 必须包含公司域名,方便官方追踪异常
  4. 文档 – 使用 代码文档生成器 自动输出函数说明 & 示例,JSDoc 注释秒变 Markdown,团队协作不迷路。

八. AI 提效四连击🚀

步骤 AI 工具 产出
生成 SDK 代码生成 一键生成 TypeScript 接口定义
代码审查 代码审查助手 提前发现未处理 reject、硬编码密钥
性能调优 代码优化 自动合并重复查询,缓存命中率 +25%
KPI 量化 开发任务管理系统KPI 把「平均响应时间」「错误率」写进 OKR

九. 总结 & Next Step✅

  1. 申请官方 Partner 账号 → 获取 BOOKING_API_KEY
  2. 复制本文代码 → 跑通 fetchHotelData
  3. 加入缓存 + 限速重试,性能 & 稳定性 UP
  4. 用 AI 提示词自动生成文档、审查、优化、KPI
  5. 上线前再读一遍 Terms of Service,合规不踩雷

搞定!🎉 立刻把「实时酒店数据」塞进你的 Node.js 项目,下一单旅程说走就走!


原文链接: https://www.omi.me/blogs/api-guides/how-to-fetch-hotel-data-using-booking-com-api-in-node-js