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
相关产品推荐
相关产品推荐

