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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(<NSHTTPURLResponse: 0x60000154cd80> { URL: https://httpbin.org/get } { Status Code: 200, Headers {
"Access-Control-Allow-Origin" = (
"*"
);
"Content-Length" = (
404
);
"Content-Type" = (
"application/json"
);
Date = (
"Thu, 08 Jul 2018 10:13:14 GMT"
);
Server = (
"gunicorn/19.9.0"
);
"access-control-allow-credentials" = (
true
);
} })

Tips

iOS 的接口中,请求回执往往定义的是 NSURLResponse 类型,但是正如我们上面所说,如果是 HTTP 请求,请求回执会被封装为 NSHTTPURLResponse 对象。像获取 statusCode 的时候就需要自己做一下类型转换。

swift 中举例:

1
2
3
4
5
6
let statusCode = (response as? HTTPURLResponse)?.statusCode ?? -1
if statusCode == 200 {
//request success.
} else {

}

系列:

URL Loading System[译]

NSURLRequest

NSURLResponse