Swift网络请求响应类URLResponse
Swift网络请求响应类URLResponse

Swift网络请求响应类URLResponse

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/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注