在 Swift 中,URLRequest 是用于配置和发送网络请求的对象。它代表了一次 HTTP 请求,允许我们定义请求的 URL、HTTP 方法(GET、POST 等)、请求头、请求体等详细信息。
1、URLRequest 的定义与用法
URLRequest 是 Swift 的 Foundation 框架中 URLSession 相关 API 的一部分,常用于与服务器交互或获取数据。
基本使用
创建 URLRequest 的典型步骤包括:
- 创建一个 URL 对象。
- 使用 URL 初始化 URLRequest 对象。
- 设置请求的 HTTP 方法、头信息或请求体(可选)。
- 使用 URLSession 发送请求并处理响应。
// 1. 创建 URL 对象
guard let url = URL(string: "https://api.example.com/data") else { return }
// 2. 创建 URLRequest 对象
var request = URLRequest(url: url)
// 3. 设置 HTTP 方法
request.httpMethod = "GET" // 或 "POST", "PUT" 等
// 4. 使用 URLSession 发送请求
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("请求失败:\(error)")
return
}
// 处理响应数据
if let data = data {
print("响应数据:\(data)")
}
}
task.resume()
2、URLRequest 的常见属性
url: URL 对象,表示请求的目标地址。
httpMethod: String,表示 HTTP 请求的方法,如 “GET”、”POST”。
allHTTPHeaderFields: [String: String],一个字典,表示 HTTP 请求头的键值对。
httpBody: Data?,请求体,用于在 POST 或 PUT 请求中发送数据。
timeoutInterval: TimeInterval,请求的超时时间(秒)。
cachePolicy: URLRequest.CachePolicy,定义请求的缓存策略,如 .reloadIgnoringCacheData。
3、常见的 URLRequest 配置示例
设置请求头
请求头用于发送认证信息、内容类型、用户代理等:
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("Bearer your-token", forHTTPHeaderField: "Authorization")
发送 JSON 数据(POST 请求)
在 POST 请求中可以将数据编码为 JSON 格式并放入 httpBody 中:
var request = URLRequest(url: url)
request.httpMethod = "POST"
let jsonData = try? JSONSerialization.data(withJSONObject: ["name": "Alice", "age": 25])
request.httpBody = jsonData
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
设置缓存策略和超时
request.cachePolicy = .reloadIgnoringLocalCacheData
request.timeoutInterval = 30.0 // 30 秒
检查 Content-Type 请求头
可以通过 URLRequest.allHTTPHeaderFields 属性查看请求头的值。这是一个包含所有已设置请求头的字典。
var request = URLRequest(url: URL(string: "https://example.com/api")!)
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// 检查是否成功设置请求头
if let contentType = request.value(forHTTPHeaderField: "Content-Type") {
print("Content-Type 设置为: \(contentType)")
}
// 打印所有请求头
if let allHeaders = request.allHTTPHeaderFields {
print("所有请求头: \(allHeaders)")
}
request.value(forHTTPHeaderField:) 用于单独查看某个请求头的值。
request.allHTTPHeaderFields 可以查看所有请求头键值对的字典。
4、使用 URLSession 发送 URLRequest
URLSession 是与服务器通信的 API。我们可以通过 URLSession.shared 或自定义的 URLSession 配置来发送请求。
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("请求出错:\(error)")
return
}
if let data = data, let responseString = String(data: data, encoding: .utf8) {
print("响应内容:\(responseString)")
}
}
task.resume()
5、上传单一文件
import Foundation
func uploadRawFile(using url: URL, fileData: Data, fileType: String) {
var request = URLRequest(url: url)
request.httpMethod = "POST"
// 设置请求头
request.setValue(fileType, forHTTPHeaderField: "Content-Type")
request.setValue("\(fileData.count)", forHTTPHeaderField: "Content-Length")
// 将文件数据放入请求体
request.httpBody = fileData
// 使用 URLSession 发送请求
let task = URLSession.shared.dataTask(with: request) { data, response, error in
if let error = error {
print("上传失败:\(error)")
return
}
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
print("上传成功")
}
}
task.resume()
}
fileData: 文件内容的 Data 对象。
fileType: 文件的 MIME 类型。
上传单个文件,将文件数据放入 httpBody。
总结
URLRequest 是一种 HTTP 请求的抽象,用于配置请求的 URL、方法、头、体等信息。
结合 URLSession 使用,可以实现网络数据的请求和响应。
URLRequest 灵活支持各种 HTTP 请求类型,并允许我们根据需求自定义。