You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Swift URLSession如何阻止自动重定向?获取302状态码

如何阻止URLRequest自动重定向以获取302状态码

嘿,这个问题我太熟悉了!iOS的URLSession默认会自动处理HTTP重定向(比如302这类状态码),所以你直接用默认会话发起请求的话,拿到的会是最终跳转后的200响应,而不是原始的302。要拿到302状态码,只需要在创建URLSession时关闭自动重定向功能就行,具体操作如下:

核心修改步骤

  • 创建自定义的URLSessionConfiguration,将allowsAutomaticRedirects设置为false
  • 使用这个配置创建专属的URLSession,替代默认的URLSession.shared
  • 用新的会话发起请求,就能获取到原始的302响应了

修改后的完整代码示例

// 处理登录参数,避免强制解包和空值问题
guard let username = LoginField.text, !username.isEmpty,
      let password = PassField.text, !password.isEmpty else {
    print("用户名或密码不能为空")
    return
}
let params = ["username": username, "password": password] as [String: String]

// 构建登录URL
guard let loginUrl = URL(string: NSLocalizedString("url_login", comment: "")) else {
    print("登录URL无效")
    return
}

// 配置请求
var request = URLRequest(url: loginUrl)
request.httpMethod = "POST" // 根据你的实际请求方式调整(GET/POST)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// 如果是表单提交,这里可以改成application/x-www-form-urlencoded并处理参数编码
request.httpBody = try? JSONSerialization.data(withJSONObject: params)

// 创建关闭自动重定向的会话配置
let sessionConfig = URLSessionConfiguration.default
sessionConfig.allowsAutomaticRedirects = false
let session = URLSession(configuration: sessionConfig)

// 发起请求
let task = session.dataTask(with: request) { data, response, error in
    // 处理请求错误
    if let error = error {
        print("请求失败:\(error.localizedDescription)")
        return
    }
    
    // 解析HTTP响应
    guard let httpResponse = response as? HTTPURLResponse else {
        print("无法解析HTTP响应")
        return
    }
    
    // 现在就能拿到原始的状态码了
    print("响应状态码:\(httpResponse.statusCode)")
    
    // 如果需要获取重定向目标URL,从Location响应头中提取
    if httpResponse.statusCode == 302, 
       let redirectUrlString = httpResponse.allHeaderFields["Location"] as? String,
       let redirectUrl = URL(string: redirectUrlString) {
        print("重定向目标URL:\(redirectUrl)")
        // 这里可以手动发起重定向请求,或者根据业务逻辑处理
    }
}

task.resume()

额外说明

  • 我帮你优化了原代码中的强制解包(as!)和空值处理,避免运行时崩溃
  • 如果你的登录请求是表单提交(而非JSON),需要修改Content-Typeapplication/x-www-form-urlencoded,并将参数编码为表单格式
  • 关闭自动重定向后,如果你需要继续完成重定向流程,可以手动提取Location头的URL,再发起新的请求

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

火山引擎 最新活动