Swift与Postman的Base64编码不一致问题咨询及修复方案
问题分析与解决方案
差异原因
Postman生成的编码遵循HTTP Basic Authentication的标准规则:将用户名:密码的格式拼接后再进行Base64编码。这里你的sandbox-key作为用户名,密码为空,所以实际编码的原始字符串是sk_289d8dd8e721484c9c8c63e39899cf90:(末尾带冒号)。
而你的Swift代码直接对sk_289d8dd8e721484c9c8c63e39899cf90(无冒号)进行Base64编码,自然会得到不同结果。Postman编码末尾的冒号来自原始拼接字符串的冒号;Swift编码末尾的等号是Base64的填充字符,对应无冒号的原始字符串。
修复方法
修改Swift代码,按照Basic Auth规则拼接字符串后再编码:
// 1. 按Basic Auth规则拼接:用户名 + ":" + 密码(密码为空) let authString = "sk_289d8dd8e721484c9c8c63e39899cf90:" // 2. 执行Base64编码 guard let authHeader = authString.base64Encoded() else { fatalError("Base64编码失败") } // 3. 转换为URL-safe格式(按需使用) let authHeaderBase64 = toggleBase64URLSafe(item: authHeader, on: true) public extension String { func base64Encoded() -> String? { return data(using: .utf8)?.base64EncodedString() } } func toggleBase64URLSafe(item: String, on: Bool) -> String { if on { let base64url = item.replacingOccurrences(of: "/", with: "_") .replacingOccurrences(of: "+", with: "-") .replacingOccurrences(of: "=", with: "") return base64url } else { var base64 = item.replacingOccurrences(of: "_", with: "/") .replacingOccurrences(of: "-", with: "+") if base64.count % 4 != 0 { base64.append(String(repeating: "=", count: 4 - base64.count % 4)) } return base64 } }
关键注意点
- 末尾冒号是Basic Auth的强制要求,即使密码为空也不能省略。
- 如果接口接受标准Base64而非URL-safe格式,直接使用
authHeader即可,无需调用toggleBase64URLSafe。
关于Postman自动转换编码
Postman导出Swift代码时,会自动按照Basic Auth规则生成正确的编码逻辑,所以导出的代码会包含冒号拼接步骤,这也是它能正常适配请求的原因。
内容的提问来源于stack exchange,提问作者Antonio Labra
相关产品推荐
相关产品推荐

