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

Swift多请求返回相同结果:同步API调用响应正常但返回ID一致

问题原因

  • 核心问题是响应数据解析逻辑错误:你调用的WooCommerce产品接口返回的是标准JSON格式二进制数据,request_data[0]取的是二进制数据的第一个字节,转字符串后得到的是JSON的首字符(通常是[或者{),和实际接口返回的产品ID无关,所以每次取值都相同。
  • 次要问题是URLSession默认缓存策略可能返回旧缓存数据,以及多处强制解包存在崩溃风险。

修复方案

1. 修正接口请求方法,直接解析返回的产品ID

func fetchIDbySKU(name: String, color: String) -> Int? {
    let sku = name + ":" + color
    // 避免强制解包崩溃
    guard let appendedsku = sku.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
          let url = URL(string: "https://www.link.com/wp-json/wc/v1/products?sku=" + appendedsku) else {
        return nil
    }

    let semaphore = DispatchSemaphore(value: 0)
    var productId: Int?
    
    var request = URLRequest(url: url, timeoutInterval: 10)
    // 显式设置忽略缓存,每次请求最新数据
    request.cachePolicy = .reloadIgnoringLocalCacheData
    request.addValue("Basic secret token", forHTTPHeaderField: "Authorization")
    request.httpMethod = "GET"

    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        defer { semaphore.signal() }
        // 校验响应
        guard let data = data, error == nil,
              let jsonArray = try? JSONSerialization.jsonObject(with: data) as? [[String: Any]],
              // WooCommerce按SKU查询返回的是数组,取第一个元素的id字段
              let firstProduct = jsonArray.first,
              let id = firstProduct["id"] as? Int else {
            print("请求或解析失败: \(error?.localizedDescription ?? "未知错误")")
            return
        }
        productId = id
    }

    task.resume()
    semaphore.wait()
    return productId
}

注意:用信号量实现同步请求会卡住当前线程,禁止在主线程调用该方法,否则会导致界面无响应,更推荐使用异步回调的方式实现接口请求。

2. 修正调用逻辑

guard let productId = fetchIDbySKU(name: name, color: color_name) else {
    // 处理请求/解析失败的情况
    return
}
parts_list.append(Item(product_id: String(productId), quantity: quantity))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:06:01