You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:30:04