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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:40:26