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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:33:01