iOS调用Google Cloud Storage API持续报NSURLErrorDomain Code=-1005错误
iOS端使用Google Cloud Storage REST API上传图片报
NSURLErrorDomain Code=-1005错误的解决方法 核心错误点
1. 请求头参数设置颠倒
你的Swift代码中Authorization头的设置逻辑完全错误,将字段名与值的位置搞反了:
// 错误写法 request.setValue("Authorization", forHTTPHeaderField: "Bearer \(accessToken)")
正确写法需与Kotlin代码逻辑对齐,将授权值放在第一个参数位置,字段名放在第二个:
request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization")
2. URL查询参数名错误
Swift代码使用了错误的查询参数名uploadItem,但Google Cloud Storage REST API要求的参数名是uploadType(与Kotlin代码中的uploadType=media一致):
// 错误写法 URLQueryItem(name: "uploadItem", value: "media") // 正确写法 URLQueryItem(name: "uploadType", value: "media")
其他优化建议
避免强制解包与内存过载
直接使用try! Data(contentsOf: fileURL)强制解包会导致文件读取失败时崩溃,且大图片直接加载进内存易引发内存问题。建议使用URLSession的upload(for:fromFile:)重载方法,直接传入文件URL:
let (data, response) = try await URLSession.shared.upload(for: request, fromFile: fileURL)
完整修正后的Swift代码
var components = URLComponents(string: "https://storage.googleapis.com/upload/storage/v1/b/\(bucketName)/o")! components.queryItems = [ URLQueryItem(name: "uploadType", value: "media"), URLQueryItem(name: "name", value: filename) ] var request = URLRequest(url: components.url!) request.setValue("Bearer \(accessToken)", forHTTPHeaderField: "Authorization") request.setValue("image/jpeg", forHTTPHeaderField: "Content-Type") request.httpMethod = "POST" let (data, response) = try await URLSession.shared.upload(for: request, fromFile: fileURL) if let httpResponse = response as? HTTPURLResponse { print("Status code:", httpResponse.statusCode) print("Response:", String(data: data, encoding: .utf8) ?? "") }
内容的提问来源于stack exchange,提问作者Nominalista
相关产品推荐
相关产品推荐

