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

将AWS Lambda的Curl请求转为Swift代码时遇{message:forbidden}问题,如何修复?

问题:Swift调用AWS Lambda API返回{message: forbidden},但Curl正常

我尝试将用于AWS Lambda函数的Curl请求编写为iOS应用的Swift调用代码。

curl -X GET -H "x-api-key: key" -H "Content-Type: application/json" "https://gvt5bk3.execute-api.us-east-2.amazonaws.com/default/functionName?mode=0&query_since=5"

以上是Curl请求示例(URL和API密钥为虚构内容)。

以下是我的Swift代码。运行该代码时,解码结果显示{message:forbidden},但在终端运行上述Curl请求却能正常工作,请问我该如何修复这个问题?

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data {
        let decoder = JSONDecoder()
        do {
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                // Now you have a dictionary representing the JSON data
                print("Decoded JSON: \(json)")
            }
            let postData = try decoder.decode(PostsResponse.self, from: data)
            DispatchQueue.main.async {
                self.updatePosts(postData: postData)
            }
        } catch {
            print("Failed to decode: \(error)")
        }
    }
}
task.resume()

修复方案

核心问题是你创建了带请求头的URLRequest对象,但调用dataTask时传入的是原始url而非配置好的request,导致请求没有携带x-api-key和Content-Type头,触发API权限拦截。

修正后的代码:

var request = URLRequest(url: url)
request.httpMethod = "GET"
request.addValue(apiKey, forHTTPHeaderField: "x-api-key")
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

// 传入配置好的request,而非原始url
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    if let error = error {
        print("Error: \(error)")
    } else if let data = data {
        // 可添加状态码打印辅助排查
        if let httpResponse = response as? HTTPURLResponse {
            print("Status code: \(httpResponse.statusCode)")
        }
        
        let decoder = JSONDecoder()
        do {
            if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                print("Decoded JSON: \(json)")
            }
            let postData = try decoder.decode(PostsResponse.self, from: data)
            DispatchQueue.main.async {
                self.updatePosts(postData: postData)
            }
        } catch {
            print("Failed to decode: \(error)")
        }
    }
}
task.resume()

额外检查点:

  • 确认apiKey变量值与Curl中的key完全一致,无空格或拼写错误
  • 若仍有问题,对比Curl和Swift请求的完整头信息,确保无遗漏

内容的提问来源于stack exchange,提问作者toptiershark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 05:24:55