Swift中使用Bearer Token认证发起无参数POST请求的问题求助
解决Bearer Token认证的无参数POST API调用问题
核心问题修正点
- Bearer Token的正确位置:Bearer认证应该放在请求头的
Authorization字段,而非请求体中,你原代码把Token塞进请求体是错误的。 - 满足POST方法的Encodable要求:既然API无请求参数,但
post方法强制要求传入Encodable类型,我们可以定义一个空结构体来填充这个参数位。
修正后的完整代码
// 定义空的Encodable结构体,专门用来填充无参数POST的参数位 struct EmptyRequestBody: Encodable {} private func getUserData(accessToken: String) async throws -> UserInfoData { let urlString = Resource.baseURL(for: .accessToken) guard let url = URL(string: urlString) else { throw URLError(.badURL) } let request = Request<UserInfoData>( url: url, httpMethod: .post(EmptyRequestBody()), // 传入空结构体满足Encodable要求 headers: ["Authorization": "Bearer \(accessToken)"] // 正确设置Bearer认证头 ) return try await service.fetch(request: request) }
额外说明
如果你的Request结构体原本没有headers参数,需要先给Request补充这个字段,或者在Request内部转成URLRequest的逻辑里添加头设置。比如Request的基础定义可以调整成这样:
struct Request<T: Decodable> { let url: URL let httpMethod: HTTPMethod let headers: [String: String]? // 新增headers参数 enum HTTPMethod { case post(Encodable) // 其他HTTP方法定义... } // 转成URLRequest的内部方法 func asURLRequest() throws -> URLRequest { var request = URLRequest(url: url) // 设置请求方法与请求体 switch httpMethod { case .post(let body): request.httpMethod = "POST" request.httpBody = try JSONEncoder().encode(body) request.setValue("application/json", forHTTPHeaderField: "Content-Type") } // 追加自定义请求头 headers?.forEach { key, value in request.setValue(value, forHTTPHeaderField: key) } return request } }
内容的提问来源于stack exchange,提问作者user23492857
相关产品推荐
相关产品推荐

