URL Loading System 之 NSURLResponse/URLResponse
NSURLResponse
NSURLResponse/URLResponse 类中存放请求的回执信息,在发送网络请求时,如果请求成功,首先会接收到服务端的回执信息,直接开始接收具体的返回数据。与协议或URL方案无关。
主要有以下几个属性,并且都是只读
的,因为是服务器帮我们指定的,所以一般我们是不能自定义这些属性的:
url
本次请求的URL地址
1 | open var url: URL? { get } |
mimeType
返回数据的数据类型(纯文本,视频,语音,超文本等)
1 | open var mimeType: String? { get } |
expectedContentLength
获取返回数据的内容长度,服务端人员不靠谱的话,这个属性的值可能奇奇怪怪,别问我为什么~
可以预计该资源的大小,计算下载进度等等。
1 | open var expectedContentLength: Int64 { get } |
textEncodingName
获取返回数据的编码方式
1 | open var textEncodingName: String? { get } |
suggestedFilename
建议的文件名字,MIMEType为扩展名
如果服务端返回的是一个文件,这个属性是一个建议的文件名字,客户端可以用它来进行保存,当然也可以自定义。
1 | open var suggestedFilename: String? { get } |
NSHTTPURLResponse
NSHTTPURLResponse/HTTPURLResponse 是 NSURLResponse 的一个子类,如果是 HTTP 请求,请求回执会被封装为 NSHTTPURLResponse 对象。
除了有父类那些属性外,还扩展了几个属性:
statusCode
请求的状态码
标准 HTTP 协议内容,不同的 code 码表示不同的请求状态,参见网络响应的常见状态 。
1 | open var statusCode: Int { get } |
allHeaderFields
请求头中所有的字段
一个字典,所以可以通过 key-value 来取值,一个简单的头部信息可能包含一些默认的 HTTP 头部信息,当然开发中我们也可以和服务端约定好自定义的字段。
1 | open var allHeaderFields: [AnyHashable : Any] { get } |
示例:
1 | (<NSHTTPURLResponse: 0x60000154cd80> { URL: https://httpbin.org/get } { Status Code: 200, Headers { |
Tips
iOS 的接口中,请求回执往往定义的是 NSURLResponse
类型,但是正如我们上面所说,如果是 HTTP 请求,请求回执会被封装为 NSHTTPURLResponse
对象。像获取 statusCode
的时候就需要自己做一下类型转换。
swift 中举例:
1 | let statusCode = (response as? HTTPURLResponse)?.statusCode ?? -1 |