Amadeus航班报价API无法设置日期范围的技术求助
问题解答
1. 解决日期范围参数报错问题
你之前误用了参数名称,Flight Offers Search API v2的日期范围参数是departureDateRange,而非dateTimeRange或dateWindow。该参数支持两种格式:
- 相对窗口格式:
[基准日期]/[时长],例如2024-07-04/I3D表示基准日期前后各1天(共3天)的出发窗口 - 固定范围格式:
[起始日期],[结束日期],例如2024-07-01,2024-07-04
注意:不能同时传入departureDate和departureDateRange参数,二选一即可。
修改后的参数示例:
parameters = { "originLocationCode": self.iata_departure_code, "destinationLocationCode": "DUB", "departureDateRange": "2024-07-04/I3D", # 替换原departureDate参数 "adults": 1, "currencyCode": "USD", "maxPrice": 2000, "max": 20, }
2. 6个月日期窗口查询的最优方案
由于Flight Offers Search API单次请求支持的日期范围有限(官方建议单次不超过30天,避免响应过大或超时),最优方案是分批次循环调用API,同时做以下优化:
优化1:缓存认证Token
你的代码目前每次查询都会重新获取Token,浪费请求资源且降低效率。建议初始化时获取Token并添加过期检查:
import time import requests class FlightSearch: def __init__(self): self.iata_departure_code = "SAC" self.bearer_token = self.authenticate() self.token_expiry = None # 记录Token过期时间 def authenticate(self): auth_token_endpoint = "https://test.api.amadeus.com/v1/security/oauth2/token" api_key = "xxxxxx" api_secret = "xxxxxxx" header = {"Content-Type": "application/x-www-form-urlencoded"} parameters = { "grant_type": "client_credentials", "client_id": api_key, "client_secret": api_secret, } response = requests.post(url=auth_token_endpoint, headers=header, data=parameters) data = response.json() self.token_expiry = time.time() + data["expires_in"] # 计算过期时间 return data["access_token"] def is_token_valid(self): # 提前60秒重新获取Token,避免过期 return time.time() < self.token_expiry - 60 def search_flights(self, departure_range): # 检查Token有效性,过期则重新获取 if not self.is_token_valid(): self.bearer_token = self.authenticate() flight_offers_endpoint = "https://test.api.amadeus.com/v2/shopping/flight-offers" header = {"Authorization": f"Bearer {self.bearer_token}"} parameters = { "originLocationCode": self.iata_departure_code, "destinationLocationCode": "DUB", "departureDateRange": departure_range, "adults": 1, "currencyCode": "USD", "maxPrice": 2000, "max": 20, } flight_response = requests.get(url=flight_offers_endpoint, params=parameters, headers=header) return flight_response.json()
优化2:分批次生成日期范围
使用datetime模块生成6个月内的多个日期批次,比如每次查询30天,分6次完成:
import datetime def generate_date_ranges(start_date_str, months=6, days_per_batch=30): start_date = datetime.datetime.strptime(start_date_str, "%Y-%m-%d") end_date = start_date + datetime.timedelta(days=months*30) current_start = start_date date_ranges = [] while current_start < end_date: current_end = current_start + datetime.timedelta(days=days_per_batch-1) if current_end > end_date: current_end = end_date # 生成固定范围格式的参数值 date_ranges.append(f"{current_start.strftime('%Y-%m-%d')},{current_end.strftime('%Y-%m-%d')}") current_start = current_end + datetime.timedelta(days=1) return date_ranges # 使用示例 flight_search = FlightSearch() # 生成从2024-07-01开始6个月的日期批次 all_ranges = generate_date_ranges("2024-07-01", months=6) all_flight_data = [] for date_range in all_ranges: batch_data = flight_search.search_flights(date_range) all_flight_data.extend(batch_data.get("data", []))
额外注意事项
- 遵守API速率限制:测试环境有请求次数限制,避免短时间内大量调用导致限流
- 处理分页:如果单次请求结果超过
max设置的数量,需通过响应中的next链接获取后续页数据 - 错误捕获:添加异常处理逻辑,处理429限流、500服务器错误等异常响应
内容的提问来源于stack exchange,提问作者Taylor Python
相关产品推荐
相关产品推荐

