URLResponse 是 Swift 中用于表示网络请求响应的类,属于 Foundation 框架。它主要用于存储和传递关于网络响应的信息,像是 HTTP 状态码、响应头、 MIME 类型等。这是与 URLSession 进行交互时,响应回来的数据的基础类型。
URLResponse 类的定义
URLResponse 是一个基础类,表示来自服务器的响应。它本身提供了一些常用的属性和方法来描述响应数据。它是 NSObject 的子类,并遵循了 NSSecureCoding、NSCopying 和 Sendable 等协议。
open class URLResponse : NSObject, NSSecureCoding, NSCopying, @unchecked Sendable {
public var url: URL? { get }
public var mimeType: String? { get }
public var expectedContentLength: Int64 { get }
public var textEncodingName: String? { get }
public var suggestedFilename: String? { get }
}
URLResponse 常用属性
1、url
类型:URL?
说明:表示响应的 URL。即使发起的请求可能包含重定向,url 属性会返回最终的响应 URL。
let responseURL = response.url
2、mimeType
类型:String?
说明:表示响应的 MIME 类型(即媒体类型)。例如,”text/html”、”image/jpeg” 等。用于告诉客户端响应的数据类型。
let mimeType = response.mimeType
3、expectedContentLength
类型:Int64
说明:表示响应主体的预期字节长度(以字节为单位)。如果服务器提供了 Content-Length 头部字段,这个值通常会等于它。
let contentLength = response.expectedContentLength
4、textEncodingName
类型:String?
说明:表示响应的文本编码名称。例如,”utf-8″,用于告诉客户端如何解码文本数据。
let textEncoding = response.textEncodingName
5、suggestedFilename
类型:String?
说明:这是服务器建议的文件名。它通常来源于 Content-Disposition 头部字段,尤其是在下载文件时。如果服务器没有提供该信息,这个值可能是 nil。
let suggestedFilename = response.suggestedFilename
URLResponse 子类
URLResponse 本身是一个非常基础的类,通常情况下,开发者更常用它的子类。以下是 URLResponse 的一些常见子类:
HTTPURLResponse
继承自:URLResponse
用途:专门处理 HTTP 请求和响应。它提供了 HTTP 特有的属性,比如状态码、响应头等。
public class HTTPURLResponse : URLResponse {
public var statusCode: Int { get }
public var allHeaderFields: [AnyHashable: Any] { get }
}
HTTPURLResponse 具有以下额外的属性:
statusCode:表示 HTTP 状态码,如 200、404 等。
allHeaderFields:表示 HTTP 响应头的字典。
例如,获取 HTTP 状态码:
if let httpResponse = response as? HTTPURLResponse {
let statusCode = httpResponse.statusCode
print("HTTP 状态码: \(statusCode)")
}
如何使用 URLResponse
URLResponse 通常是通过网络请求的回调来使用的,比如通过 URLSession 发起请求时,响应会通过 completionHandler 返回:
let url = URL(string: "https://fangjunyu.com")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
print("请求失败: \(error)")
return
}
if let response = response {
print("响应的 URL: \(response.url)")
print("响应的 MIME 类型: \(response.mimeType)")
print("响应的内容长度: \(response.expectedContentLength)")
print("响应的文本编码名称: \(response.textEncodingName)")
print("响应的文件名建议: \(response.suggestedFilename)")
}
}
task.resume()
返回信息:
响应的 URL: Optional(https://www.fangjunyu.com/)
响应的 MIME 类型: Optional("text/html")
响应的内容长度: 84766
响应的文本编码名称: Optional("utf-8")
响应的文件名建议: Optional("www.fangjunyu.com.html")
URLResponse 与 HTTPURLResponse 比较
URLResponse:是一个通用的类,表示网络请求的响应。它提供基本的响应信息,但不包含与 HTTP 相关的特定信息(例如 HTTP 状态码、响应头等)。
HTTPURLResponse:是 URLResponse 的子类,专门用于处理 HTTP 协议的响应。它提供更多关于 HTTP 响应的信息,如状态码和响应头。大多数情况下,URLSession 会返回 HTTPURLResponse 对象,而不是 URLResponse。
总结
URLResponse 是一个表示网络请求响应的基础类,包含了关于响应的一些基本信息(例如 URL、MIME 类型、内容长度、编码方式等)。
HTTPURLResponse 是其子类,专门处理 HTTP 请求和响应,包含更多与 HTTP 相关的信息,如状态码和响应头。
相关文章
Swift Sendable协议:https://fangjunyu.com/2025/04/07/swift-sendable%e5%8d%8f%e8%ae%ae/