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

Swift中URL请求如何正确传递X-ACCESS-KEY并解码响应?

解决密钥传递错误及完成数据处理任务

问题分析

你的代码存在以下几个关键错误:

  • 密钥字符串末尾多了一个多余的右括号
  • 请求头使用错误:应该用X-ACCESS-KEY而非X-Master-Key,且不需要添加Bearer 前缀
  • 未实现数据排序、过滤和拼接的核心逻辑
  • 使用JSONSerialization类型安全性不足,建议改用Codable协议

修正后的完整代码

import Foundation

// 定义对应JSON结构的模型,用Codable简化解码逻辑
struct ResponseData: Codable {
    let records: [Item]
}

struct Item: Codable {
    let foo: String
    let bar: Int
    let baz: Int
}

// 修正后的密钥(移除末尾多余的右括号)
let accessKey = "$2b$10$Ke1iwieFO7/7qsSKU.GYU.oYXZMW1EeHrwd4xx9ylboJik5mstZk6"
guard let url = URL(string: "https://api.jsonbin.io/v3/b/646bed328e4aa6225ea22a79") else {
    fatalError("无效的请求URL")
}

var request = URLRequest(url: url)
// 添加正确的权限请求头
request.addValue(accessKey, forHTTPHeaderField: "X-ACCESS-KEY")
// 声明接受JSON格式响应(GET请求可省略,添加后更规范)
request.addValue("application/json", forHTTPHeaderField: "Accept")

let task = URLSession.shared.dataTask(with: request) { data, _, error in
    if let error = error {
        print("请求错误: \(error.localizedDescription)")
        return
    }
    
    guard let data = data else {
        print("未获取到有效数据")
        return
    }
    
    do {
        // 解码JSON数据
        let responseData = try JSONDecoder().decode(ResponseData.self, from: data)
        
        // 1. 按元素的bar字段升序排序(降序可改为 $0.bar > $1.bar)
        let sortedItems = responseData.records.sorted { $0.bar < $1.bar }
        
        // 2. 过滤出baz能被3整除的元素
        let filteredItems = sortedItems.filter { $0.baz % 3 == 0 }
        
        // 3. 拼接所有元素的foo值
        let concatenatedFoo = filteredItems.map { $0.foo }.joined(separator: "")
        
        print("最终拼接结果: \(concatenatedFoo)")
        
    } catch {
        print("数据解码错误: \(error.localizedDescription)")
    }
}

task.resume()

// 命令行环境下保持程序运行(Xcode项目/Playground中可删除此句)
RunLoop.main.run(until: Date().addingTimeInterval(10))

关键修正说明

  1. 密钥修正:移除了密钥字符串末尾多余的),保证密钥格式正确
  2. 请求头修正:替换为要求的X-ACCESS-KEY字段,直接传入密钥值,无需额外前缀
  3. 数据处理实现:
    • 排序:使用sorted方法根据bar字段完成排序
    • 过滤:使用filter方法筛选出baz能被3整除的元素
    • 拼接:通过map提取所有foo值,再用joined拼接成完整字符串
  4. 类型安全优化:用Codable协议替代JSONSerialization,避免类型转换的潜在风险

内容的提问来源于stack exchange,提问作者Ahmed Zaidan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:44:56