主文件与测试文件调用Tequila API返回结果不一致求助
背景
正在进行API开发,项目核心功能:
- 从谷歌表格读取IATA机场代码(此部分运行正常)
- 向Tequila API(端点:
https://api.tequila.kiwi.com)发送GET请求,获取明日起至6个月内的最便宜航班。
问题表现
主文件与测试文件使用相同参数调用API时,返回结果存在差异:
- 主文件保留
"ret_dtime_from": "16:00"参数时,返回结果为空;移除该参数后,可获取到2023年2月3日出发、2月5日返回,HKT至SIN起飞时间为09:00AM的航班。 - 测试文件使用包含
"ret_dtime_from": "16:00"的参数,能正常获取到对应2023年2月3日出发、2月5日返回,HKT至SIN起飞时间为16:15的航班数据。
代码片段
主文件简化代码
tomorrow = (datetime.today() + timedelta(1)).strftime("%d/%m/%Y") six_months_date = (datetime.today() + timedelta(weeks=24)).strftime("%d/%m/%Y") parameter_WE = { "fly_from": "SIN", "fly_to": "", "date_from": tomorrow, "date_to": six_months_date, "nights_in_dst_from": 2, "nights_in_dst_to": 2, "max_fly_duration": 7, "flight_type": "round", "adults": 1, "selected_cabins": "M", "adult_hold_bag": "1", "partner_market": "sg", "curr": "SGD", "max_stopovers": 0, "vehicle_type": "aircraft", "limit": 10, "fly_days": "5", "dtime_from": "19:00", "ret_dtime_from": "16:00" } def main(element: list): list_result = [] # element格式为[city, IATAcode, cost] if element[1] == "HKT": parameter_WE["fly_to"] = element[1] response = requests.get(url=URL_BOOKING, headers=self.header_booking, params=parameter_WE) if response.json()["data"]: data = response.json()["data"][0] dict_data = { "to": data["flyTo"], "price": round(data["fare"]["adults"]), "datefrom": f'{data["local_departure"].split("T")[0]} - {data["local_departure"].split("T")[1].split(".")[0][:-3]}', "dateto": f'{data["route"][1]["local_departure"].split("T")[0]} - {data["route"][1]["local_departure"].split("T")[1].split(".")[0][:-3]}', "airlinefrom": data["route"][0]["airline"], "airlinereturn": data["route"][1]["airline"], } list_result.append(dict_data) return list_result
测试文件代码
tomorrow = (datetime.today() + timedelta(1)).strftime("%d/%m/%Y") six_months_date = (datetime.today() + timedelta(weeks=24)).strftime("%d/%m/%Y") header_booking = { "accept": "application / json", "apikey": KEY_BOOKING } parameter_WE = { "fly_from": "SIN", "fly_to": "HKT", "date_from": "03/02/2023", "date_to": "05/02/2023", "nights_in_dst_from": 2, "nights_in_dst_to": 2, "max_fly_duration": 7, "flight_type": "round", "adults": 1, "selected_cabins": "M", "adult_hold_bag": "1", "partner_market": "sg", "curr": "SGD", "max_stopovers": 0, "vehicle_type": "aircraft", "limit": 10, "fly_days": "5", "dtime_from": "19:00", "ret_dtime_from": "16:00" } response = requests.get(url=URL_BOOKING, headers=header_booking, params=parameter_WE) return response.text
排查与解决方向
日期范围不一致
测试文件硬编码了date_from和date_to为"03/02/2023"和"05/02/2023",而主文件使用动态计算的tomorrow和six_months_date。若运行主文件时,动态生成的日期范围不包含测试指定的区间,会导致API返回空结果。
验证方式:临时将主文件的动态日期替换为测试文件的硬编码值,确认是否能返回数据。若可行,调整动态日期计算逻辑或API参数的日期范围。全局参数污染
主文件中parameter_WE是全局变量,多次调用main函数时,fly_to参数会被重复修改,导致后续请求参数不符合预期。
解决方式:将parameter_WE的定义移到main函数内部,或每次调用前重新初始化参数字典,避免全局变量污染。示例:def main(element: list): list_result = [] # 每次调用重新初始化参数 parameter_WE = { "fly_from": "SIN", "fly_to": element[1], "date_from": (datetime.today() + timedelta(1)).strftime("%d/%m/%Y"), # 其他参数保持不变 } if element[1] == "HKT": response = requests.get(url=URL_BOOKING, headers=self.header_booking, params=parameter_WE) # 后续逻辑...请求头差异
主文件使用self.header_booking,测试文件使用直接定义的header_booking,两者可能存在细微差异(比如测试文件的accept头带有空格:"application / json"),可能影响API返回结果的筛选逻辑。
解决方式:打印并对比两者的请求头内容,确保完全一致。响应筛选逻辑局限
主文件只取response.json()["data"][0](第一条结果),但API返回结果的排序可能不同,符合条件的航班可能不在第一条位置,导致被遗漏。
解决方式:在主文件中打印完整的response.json()["data"],查看是否存在符合条件的航班,再调整筛选逻辑。
内容的提问来源于stack exchange,提问作者NickTahmer

