为什么iOS端调用Amadeus机场城市搜索API无法返回数据?
问题排查与修复方案
1. 修复请求头书写错误
你当前代码的请求头参数顺序写反,是导致请求失败的最核心原因:
原错误代码:
request.addValue("Authorization", forHTTPHeaderField: "Bearer \(apiKey)")
修正为:
request.addValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
HTTP请求头的字段名是Authorization,字段值是Bearer + 你的访问令牌,顺序写反会导致授权校验失败,API不会返回正确数据。
2. 修正数据模型可选类型配置
Amadeus返回的部分机场/城市数据中,timeZoneOffset和regionCode字段可能为空,你当前的模型定义为非可选类型,会触发JSON解析失败,看起来像没有返回数据:
修正后的模型:
struct TopLevelObject: Codable { let data: [Airport] } struct Airport: Codable { let name, detailedName: String let id: String let timeZoneOffset: String? // 改为可选类型 let iataCode: String let geoCode: GeoCode let address: Address } struct Address: Codable { let cityName, cityCode, countryName, countryCode: String let regionCode: String? // 改为可选类型 } struct GeoCode: Codable { let latitude, longitude: Double }
3. 新增HTTP响应状态码校验
当前代码没有校验响应状态码,授权失败、参数错误等异常情况无法识别,在解析数据前新增校验逻辑:
let task = URLSession.shared.dataTask(with: request) { data, response, error in if let error = error { completion(.failure(.thrownError(error))) print("Error in \(#function) : \(error.localizedDescription) \n---\n \(error)") return } // 新增状态码校验 guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { completion(.failure(.invalidResponse)) print("无效响应: \(response ?? "无响应")") return } guard let data = data else { return completion(.failure(.noData)) } do { let topLevelObject = try JSONDecoder().decode(TopLevelObject.self, from: data) completion(.success(topLevelObject.data)) } catch { completion(.failure(.serverError(error))) print("解析错误: \(error)") // 调试时可新增下面代码打印原始返回内容,方便排查问题 if let responseStr = String(data: data, encoding: .utf8) { print("接口返回原始内容: \(responseStr)") } } }
4. 其他常见问题排查
- 如果你使用的是Amadeus测试环境的密钥,测试环境数据集仅覆盖少量热门航线的城市机场,部分英美城市没有收录,可切换为生产环境密钥获取全量数据。
- 检查
typeQueryValue参数值是否为AIRPORT、CITY、ANY中的一个,参数值错误会过滤掉所有结果。 - 确认没有添加其他国家码限制参数,避免过滤掉英美城市的结果。
内容的提问来源于stack exchange,提问作者ali.ios
相关产品推荐
相关产品推荐

