Swift中GET请求无法执行,传入URL时出现nil值错误如何解决
问题根本原因
URL(string:) 只有传入完全符合RFC 3986规范的字符串才会返回合法实例,你当前手动拼接URL参数的逻辑没有对参数值做百分号转义,一旦category参数包含中文、空格、特殊符号(&、%、#等),生成的sUrl就不符合URL规范,导致URL(string:)返回nil,你用!强制解包就会触发Found nil崩溃。
排查步骤
- 先在拼接完sUrl后加一行打印:
print("原始URL字符串:\(sUrl)"),检查输出的字符串里是否存在未转义的非法字符,确认是不是参数内容导致的URL格式错误 - 临时把
category参数写死为纯英文无特殊符号的字符串,比如"animal",运行看是否还会崩溃,如果不再崩溃就可以100%确认是参数未编码的问题
修复方案
推荐方案:用系统自带URLComponents拼接参数(无需手动处理编码)
完全替换你原来手动拼接参数的代码段,系统会自动帮你处理所有参数的编码逻辑,同时去掉强制解包避免崩溃:
func fetchAllSticker(category: String, APITokenString: String) { // 1. 生成基础URL组件 guard let baseUrl = URL(string: "http://xyzabc.com/api/stickers") else { print("基础URL格式错误") return } var components = URLComponents(url: baseUrl, resolvingAgainstBaseURL: true) // 2. 添加query参数,系统自动完成编码 components?.queryItems = [ URLQueryItem(name: "category", value: category) ] // 3. 安全解包最终URL,禁止强制解包 guard let finalUrl = components?.url else { print("生成URL失败,请检查参数合法性") return } var request = URLRequest(url: finalUrl) request.httpMethod = "GET" // 提示:GET请求没有请求体,不需要设置Content-Type头,可直接删除该行 request.addValue("application/json", forHTTPHeaderField: "Accept") request.addValue("Bearer "+APITokenString, forHTTPHeaderField: "Authorization") // 后续原有网络请求逻辑保持不变 let session = URLSession.shared session.dataTask(with: request) { (data, response, error) in if let httpResponse = response as? HTTPURLResponse { print("statusCode: \(httpResponse.statusCode)") } if let data = data{ do { guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] else { return } print(json) }catch { print("Error\(error)") } } }.resume() }
保留手动拼接逻辑的修复方案
如果要继续用原有手动拼接的写法,需要对参数的value做百分号编码:
for (key,value) in params { // 对参数值做URL query场景的编码 guard let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else { continue } sParams += key + "=" + encodedValue print("\(key), \(value)") }
内容的提问来源于stack exchange,提问作者iosDevSan
相关产品推荐
相关产品推荐

