将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
相关产品推荐
相关产品推荐

