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

iOS 17下URL编码导致服务器API调用失败求助

解决iOS 17中URL保留[]字符的问题

问题背景

调用第三方API时,请求URL的查询参数包含[]字符(如codadd[0]),但iOS 17后URL(string:)会严格遵循RFC 3986标准自动将[编码为%5B、]编码为%5D,导致服务器无法识别参数并返回错误,需强制保留原[]字符。

可行解决方案

方案1:通过Data手动构造URL

直接拼接完整URL字符串,转换为UTF-8 Data后创建URL,绕过系统自动编码逻辑:

let fullUrlString = "http://109.168.113.11/Acucgi/G7TestWeb.sh?funzione=charge_pms&utente=WXWX&password=TESTWWW1&azienda=RISTORANTE&modo=Json&fl_ad=A&camera=5&data_del=20231004&codadd[0]=V10&qtaadd[0]=1&impadd[0]=7,80&desadd[0]=Cappuccinos"

guard let urlData = fullUrlString.data(using: .utf8),
      let url = URL(data: urlData, relativeTo: nil) else {
    print("!! url !!")
    return
}

var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 处理响应逻辑
}
task.resume()

方案2:使用URLComponents直接设置query字符串

如果需要拆分base URL和查询参数,可通过URLComponents直接赋值完整query字符串,避免使用queryItems触发自动编码:

let baseUrl = URL(string: "http://109.168.113.11/Acucgi/G7TestWeb.sh")!
var components = URLComponents(url: baseUrl, resolvingAgainstBaseURL: false)!

components.query = "funzione=charge_pms&utente=WXWX&password=TESTWWW1&azienda=RISTORANTE&modo=Json&fl_ad=A&camera=5&data_del=20231004&codadd[0]=V10&qtaadd[0]=1&impadd[0]=7,80&desadd[0]=Cappuccinos"

guard let url = components.url else {
    print("!! url !!")
    return
}

var request = URLRequest(url: url)
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    // 处理响应逻辑
}
task.resume()

注意事项

  • 不要使用URLQueryItem构造参数,因为它会自动对[]进行编码,无法满足需求。
  • 确保URL字符串本身是合法的,除了[]外没有其他需要编码的特殊字符(如果有,需手动处理这些字符的编码,仅保留[]不编码)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:29