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-Type为application/x-www-form-urlencoded,并将参数编码为表单格式 - 关闭自动重定向后,如果你需要继续完成重定向流程,可以手动提取
Location头的URL,再发起新的请求
内容的提问来源于stack exchange,提问作者AlexP




