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

Swift中使用URLSession调用WunderGraph订阅接口超时问题求助

解决Swift URLSession调用WunderGraph订阅超时(错误码-1001)的方案
  • 调整URLSession超时配置
    默认的timeoutIntervalForRequest(60秒)对于长连接订阅来说过短,直接触发超时。需要针对性调大超时参数:

    let config = URLSessionConfiguration.default
    // 请求超时设为5分钟,覆盖长连接的空闲等待期
    config.timeoutIntervalForRequest = 300
    // 资源超时设为1天,适配订阅的长期连接需求
    config.timeoutIntervalForResource = 86400
    let session = URLSession(configuration: config)
    
  • 禁用HTTP Pipelining
    WunderGraph订阅通常基于HTTP/2或WebSocket实现,而httpShouldUsePipelining是HTTP/1.1的特性,强制开启可能和HTTP/2的多路复用机制冲突,导致连接异常中断:

    config.httpShouldUsePipelining = false
    
  • 完全匹配请求头(对齐cURL/Postman配置)
    复制cURL/Postman中所有请求头,尤其是订阅相关的关键字段,避免因头信息缺失或不匹配导致服务端拒绝长连接:

    var request = URLRequest(url: yourWunderGraphSubscriptionURL)
    request.httpMethod = "POST" // 确保和cURL的请求方法一致
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    // 若为SSE类型订阅,Accept需设为text/event-stream
    request.setValue("text/event-stream", forHTTPHeaderField: "Accept")
    request.setValue("keep-alive", forHTTPHeaderField: "Connection")
    request.setValue("no-cache", forHTTPHeaderField: "Cache-Control")
    // 添加授权等自定义头,完全对齐cURL中的配置
    request.setValue("Bearer your-auth-token", forHTTPHeaderField: "Authorization")
    
  • 使用数据流模式处理实时数据
    不要用传统的dataTask(with:completionHandler:),它会等待完整响应返回(长连接永远不会完成),必然触发超时。改用实时数据流处理方式:

    // 方案1:Combine(iOS 13+)
    import Combine
    let cancellable = session.dataTaskPublisher(for: request)
      .sink(receiveCompletion: { completion in
        // 处理连接终止或错误
      }, receiveValue: { data, response in
        // 实时处理收到的分片数据
        if let content = String(data: data, encoding: .utf8) {
          print("实时数据:\(content)")
        }
      })
    
    // 方案2:URLSessionDataDelegate(兼容低版本iOS)
    class SubscriptionHandler: NSObject, URLSessionDataDelegate {
      func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
        // 实时处理每一批收到的数据
      }
    }
    let handler = SubscriptionHandler()
    let session = URLSession(configuration: config, delegate: handler, delegateQueue: nil)
    let task = session.dataTask(with: request)
    task.resume()
    
  • 排查网络环境干扰
    iOS的URLSession可能受系统代理、VPN或网络防火墙影响,导致连接中途断开。尝试关闭代理/VPN,切换到稳定的Wi-Fi或蜂窝网络测试。

  • 核对WunderGraph订阅端点要求
    部分场景下WunderGraph要求使用WebSocket而非HTTP长连接,此时需改用URLSessionWebSocketTask实现:

    let webSocketTask = session.webSocketTask(with: yourWunderGraphWebSocketURL)
    webSocketTask.resume()
    // 发送订阅请求
    let subscribeMsg = URLSessionWebSocketTask.Message.string("{\"query\": \"your-subscription-query-content\"}")
    webSocketTask.send(subscribeMsg) { error in
      if let err = error { print("发送订阅请求失败:\(err)") }
    }
    // 循环接收实时消息
    func handleWebSocketReceive(result: Result<URLSessionWebSocketTask.Message, Error>) {
      switch result {
      case .success(let msg):
        if case .string(let content) = msg {
          print("WebSocket实时数据:\(content)")
        }
        webSocketTask.receive(completionHandler: handleWebSocketReceive)
      case .failure(let err):
        print("接收消息失败:\(err)")
      }
    }
    webSocketTask.receive(completionHandler: handleWebSocketReceive)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 14:30:32