HTTP请求保文-NSURLRequest

262 阅读3分钟

用于HTTP信息交互的信息叫做HTTP保文,请求端(客户端)的HTTP保文叫做请求报文,响应端(服务端)的保文叫做响应保文,NSURLrequest就是请求报文,NSURLResponse就是响应保文。

HTTP保文是多行数据构成的字符串文本,大致可以分为保文首部和保文主体2部分,两者由最初出现的空行(CR+LF)来划分。通常,保文不一定有保文主体。

image.png

NSURLRequest

allHTTPHeaderFields包含了请求头部字段,有一些保留的(resersed)字段,这些字段是无法设置的。
- setValue:forHTTPHeaderField:可以用来设置头部字段(header fields),但是不要设置保留字段,比如Content-Length。即使设置了保留字段也会被覆盖点
- addValue:forHTTPHeaderField:给头部字段(header fields)添加值。如果头部字段已经存在,会在已经存在的值后面添加个字符串。

保留头部字段(reversed Header Fields)

Content-Length: 设置Content-Length是基于是否知道请求体长度,如果知道请求体长度,就设置请求体长度;如果不知道请求体长度,就省略Content-Length字段。

请求体(request body)

设置请求体有2种方式:HTTPBody使用NSdata对象设置请求体,请求体长度固定;HTTPBodyStream使用NSInputStream对象设置请求体,不能确定请求体长度。

其他保留字段有:Authorization、Connection、Host、Proxy-Authenticate、Proxy-Authorization、WWW-Authenticate

问:设置为NSInputStream为啥就不知道请求体大小? 答:不太清楚,答案待补充😂

HTTPMethod

字符串类型,默认为"GET"
GET:获取资源,应用场景有:图片下载、多线程文件下载,断点续传 image.png POST:传输实体主体,应用场景有:文件下载,大文件分片上传、 image.png HEAD:获得保文首部,不要保文主体。应用场景有:验证缓存资源的有效性和更新时间 image.png PUT:上传文件,但是HTTP/1.1本身不带验证机制,谁都可以上传文件,所以不一般不用PUT方法上传文件。 image.png DELETE:请求删除指定URI资源,但是该方法没有验证机制,所以一般不使用这个方法删除文件 image.png OPTIONS:查询请求URI指定的资源支持的方法 image.png

其他属性

timeoutInterval请求超时时间。在请求期间,如果空闲时间超过timeoutInterval,就认为请求超时,默认是60s
HTTPShouldUsePipeliningrequest是否可以在未收到response之前继续传输数据
问:数据传输过程中的Pipelining behavior是什么?
HTTPShouldHandleCookies是否使用默认cookie处理request,如果在求情头部有cookie字段,这个属性就不会有影响
allowsCellularAccess是否允许使用用户的蜂窝网络
networkServiceType网络类型,例如:声音类型、视频类型、背景模式类型等

请求/响应保文的结构

最后看下请求报文和响应保文的结构

image.png

image.png

请求行:包含请求方法 请求URI HTTP版本 状态行:HTTP版本 响应结果状态码 原因短语