Swift中携带Bearer Token与JSON Body的GET请求实现求助
Swift GET请求问题排查与修正方案
核心问题梳理
- URL错误:错误地将Bearer Token拼接在URL路径末尾,正确URL应为指定的
https://pincood.com/pincood/public/api/user/details - 请求头拼写错误:
AUthorization拼写错误,标准键名是Authorization - 模型类型不匹配:JSON中多个字段为
null,但模型定义为非可选类型,导致解析失败 - 缺少GET请求Body:未实现用户要求的“携带JSON Body的GET请求”逻辑
- Session头值不完整:提供的Session值
fb4e7f9b-0f31-4709-格式不完整,需确认有效值
修正后的代码实现
1. 修正后的TokenResponse模型
struct TokenResponse: Codable { let id: Int let referral_code: String let referance_referral_code: String let first_name: String let last_name: String let payment_mode: String let email: String let gender: String let birth_date: String let mobile: String let country_code: String let picture: String let device_token: String let device_id: String let device_type: String let login_by: String let social_unique_id: String? // 改为可选类型,适配null值 let latitude: String? // 改为可选类型,适配null值 let longitude: String? // 改为可选类型,适配null值 let stripe_cust_id: String? // 改为可选类型,适配null值 let wallet_balance: Int let rating: String let otp: Int let updated_at: String let emergency_contact1: String let emergency_contact2: String let deleted_at: String? // 改为可选类型,适配null值 let currency: String let sos: String let rental_content: String let outstation_content: String }
注:CodingKeys可省略,所有字段名与JSON键完全匹配,Codable会自动映射
2. 修正后的请求函数
func getRequest() { // 使用正确的API地址 guard let url = URL(string: "https://pincood.com/pincood/public/api/user/details") else { print("无效的URL") return } var request = URLRequest(url: url) request.httpMethod = "GET" // 设置请求头 request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 修正Authorization拼写,使用正确的Token request.setValue("Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjIsImlzcyI6Imh0dHBzOi8vcGluY29vZC5jb20vcGluY29vZC9wdWJsaWMvYXBpL3VzZXIvbG9naW4iLCJpYXQiOjE2Njc4MjMxNzAsImV4cCI6MTY2ODE4MzE3MCwibmJmIjoxNjY3ODIzMTcwLCJqdGkiOiJVemo4bFp3ek16Z2FIV25QIn0.oCAk6db9c2BAhEGgU2gziYm2RX3hLbAtPUc7KQzIYWs", forHTTPHeaderField: "Authorization") // 替换为完整有效的Session值 request.setValue("fb4e7f9b-0f31-4709-xxxx", forHTTPHeaderField: "Session") // 添加GET请求的JSON Body(根据API要求调整Body内容) let bodyParams = ["key": "value"] // 示例参数,替换为API要求的Body内容 do { request.httpBody = try JSONSerialization.data(withJSONObject: bodyParams) } catch { print("序列化Body失败:\(error)") return } URLSession.shared.dataTask(with: request) { data, response, error in // 处理网络错误 if let error = error { print("网络请求错误:\(error)") return } // 检查响应状态码 if let httpResponse = response as? HTTPURLResponse { print("响应状态码:\(httpResponse.statusCode)") // 可根据状态码做进一步判断,比如200为成功 } // 解析返回数据 guard let data = data else { print("未获取到响应数据") return } // 打印原始响应数据,方便调试 if let responseString = String(data: data, encoding: .utf8) { print("原始响应:\(responseString)") } do { let decoder = JSONDecoder() let codableData = try decoder.decode(TokenResponse.self, from: data) print("解析成功:\(codableData)") } catch let parsingError { print("解析失败:\(parsingError)") } }.resume() } getRequest()
额外调试建议
- 打印原始响应数据:直接查看服务器返回内容,判断是请求错误还是解析错误
- 检查状态码:根据HTTP状态码定位问题(如401代表Token无效,404代表地址错误,500代表服务器内部错误)
- 确认API要求:部分服务器不支持GET请求带Body,若遇到此类情况,需确认API规则或改为POST请求
内容的提问来源于stack exchange,提问作者Simran Bhavsar
相关产品推荐
相关产品推荐

