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

如何在iOS应用中调用AWS部署的REST API?解决403访问被拒问题

iOS调用AWS REST API GET请求解决403 Forbidden问题

核心问题定位

Postman能成功但Swift代码返回403,大概率是请求头里的认证信息未正确配置——AWS的REST API(比如API Gateway结合IAM认证)需要特殊的签名处理,Postman可能自动完成了签名逻辑,但直接用它生成的代码不会包含这部分关键内容。

分步解决步骤

1. 确认API认证类型

先明确你的AWS REST API采用的认证方式,不同方式的实现逻辑完全不同:

  • API Key认证:最简单,直接在请求头添加固定字段
  • IAM认证:需用AWS SDK生成签名请求头,手动拼接几乎无法实现
  • OAuth2/Cognito认证:需携带ID Token或Access Token

2. 对应场景的实现代码

场景1:API Key认证

如果你的API用API Key验证,直接在URLSession请求中添加对应头即可:

import Foundation

func fetchAWSData() {
    guard let apiUrl = URL(string: "你的AWS API完整地址") else { return }
    
    var request = URLRequest(url: apiUrl)
    request.httpMethod = "GET"
    // 替换为你的实际API Key值
    request.setValue("YOUR_API_KEY", forHTTPHeaderField: "x-api-key")
    // 若Postman中还有其他必填头,一并添加
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            print("请求出错:\(error.localizedDescription)")
            return
        }
        
        guard let httpResp = response as? HTTPURLResponse, (200...299).contains(httpResp.statusCode) else {
            print("请求失败,状态码:\(response as? HTTPURLResponse?.statusCode ?? -1)")
            return
        }
        
        if let data = data, let jsonStr = String(data: data, encoding: .utf8) {
            print("返回数据:\(jsonStr)")
            // 后续解析逻辑
        }
    }
    task.resume()
}

场景2:IAM认证(依赖AWS SDK)

如果是IAM认证,必须借助AWS SDK生成签名,手动处理签名会因时间戳、密钥加密等逻辑出错:

  1. 集成AWS SDK:在Podfile中添加
pod 'AWSCore'
pod 'AWSAPIGateway'

执行pod install完成集成

  1. 配置AWS凭证:在Info.plist中添加(或使用Cognito身份池)
<dict>
    <key>AWS</key>
    <dict>
        <key>Default</key>
        <dict>
            <key>Region</key>
            <string>你的AWS区域,如us-east-1</string>
            <key>CredentialsProvider</key>
            <dict>
                <key>CognitoIdentity</key>
                <dict>
                    <key>PoolId</key>
                    <string>你的Cognito身份池ID</string>
                </dict>
            </dict>
        </dict>
    </dict>
</dict>
  1. 发送签名请求的代码:
import AWSCore
import AWSAPIGateway

func fetchWithIAMAuth() {
    let apiClient = AWSAPIGatewayClient.default()
    let request = AWSAPIGatewayRequest()
    request.urlString = "你的AWS API完整地址"
    request.httpMethod = "GET"
    
    apiClient.invoke(request) { response, error in
        if let error = error {
            print("请求出错:\(error.localizedDescription)")
            return
        }
        
        if let data = response?.data, let jsonStr = String(data: data, encoding: .utf8) {
            print("返回数据:\(jsonStr)")
            // 后续解析逻辑
        }
    }
}

3. 对比Postman与代码的请求头差异

打开Postman的Headers标签,把所有请求头逐一列出,对比Swift代码中的请求头,确保没有遗漏Host、Authorization(IAM认证的签名头)等关键字段。

4. 检查IAM权限配置

如果是IAM认证,需确保你的IAM用户/角色拥有调用该API的权限,示例IAM策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:你的区域:你的AWS账号ID:你的API ID/*/GET/你的资源路径"
        }
    ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 11:25:32