IOS中的HTTP请求处理
一、HTTP协议
1、定义
HTTP的全称:超文本传输协议,用来定制传输数据的规范(客户端和服务器之间的数据传输规范)
HTTP完整通信过程:请求行、请求头、请求体
二、通信过程
1、请求(客户端到服务端)
状态行
请求头(描述客户端信息)
请求体(POST请求才有,存放具体数据)
2、响应(服务端到客户端)
状态行(响应行:HTTP协议版本\状态码\状态信息)
响应头(服务器信息\返回数据类型\返回数据长度)
实体内容(响应体,返回给客户端的具体内容)
三、HTTP请求类型
1、GET
- 参数拼接在URL后面
- 参数有限制
2、POST
- 参数都在请求体
- 参数没有限制
- 文件上传只能用POST
3、HEAD
- 获得响应头信息,不获取响应体
- request.HTTPMethod = @"HEAD";
4、Delete
四、IOS中发送GET\POST的方式
1、NSURLConnection
- 苹果原生
- 使用起来比ASI\AFN复杂
2、ASI
- 基于CFNetwork
- 提供了非常多强大的功能,使用简单
3、AFN
- 基于NSURLConnection
- 提供了常用的功能(无法监听进度)
五、NSURLConnection
1、发送同步请求
//响应对象
NSURLResponse *response = nil;
//错误类
NSError *error = nil;
//发送同步请求
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
2、发送异步请求(block)
//请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"URLString"]];
//异步请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
}];
3、发送异步请求(delegate)
//第一种
[NSURLConnection connectionWithRequest:request delegate:self];
//第二种
[[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
//第三种
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
[connection start];
4、文件下载(大文件下载)
方案:边下载边写入(写到沙盒的某个文件中)
具体实现:
a.在接收到服务器的响应时,创建一个空文件
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:@"文件路径" contents:nil attributes:nil];
b.创建一个跟空文件相关联的句柄对象
NSFileHandle *writeHandler = [NSFileHandle fileHandleForReadingAtPath:@"文件路径"];
c.在接收到服务器数据时,利用句柄对象将服务器返回的数据写入
//移动到尾部
[self.writeHandler seekToEndOfFile];
//从当前为开始写
[self.writeHandler writeData:data];
d.在接受完数据后,关闭句柄
//关闭句柄
[self.writeHandler closeFile];
self.writeHandler = nil;
5、断点下载
设置请求头的Range,告诉服务器下载哪一段数据
NSString *values = [NSString stringWithFormat:@"bytes=%lld-%lld",self.begin + self.currentLength, self.end];
[request setValue:value forHTTPHeaderField:@"Range"];
6、文件上传
只能用POST请求,请求参数都在请求体中(文件参数\非文件类型的参数)
a.拼接请求体(文件参数)
#define HMEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding]
NSMutableData *body = [NSMutableData data];
//参数开始标记
[body appendData:HMEncode(@"--heima\r\n")];
//参数描述
[body appendData:HMEncode(@"Content-Disposition: form-data; name=\"file\"; filename=\"20140519_27.png\"\r\n")];
// 文件类型:Content-Type
[body appendData:HMEncode(@"Content-Type: image/png\r\n")];
//\r\n文件二进制数据\r\n
[body appendData:HMEncode(@"\r\n")];
NSData *fileData = UIImagePNGRepresentation(image);
[body appendData:fileData];
[body appendData:HMEncode(@"\r\n")];
//结束
[body appendData:HMEncode(@"--heima--\r\n")];
request.HTTPBody = body;
b.设置请求头
请求数据长度:
[request setValue:[NSString stringWithFormat:@"%zd", body.length] forHTTPHeaderField:@"Content-Length"];
请求数据类型Content-Type:
普通的post请求:application/x-www-form-urlencoded
上传文件的post请求:multipart/form-data;boundary=boundary
六、NSURLCache缓存
获取全局缓存对象
NSURLCache *cache = [NSURLCache sharedURLCache];
设置缓存容量
cache.memoryCapacity = 1024 * 1024;
cache.diskCapacity = 20 * 1024 * 1024;
设置请求的缓存策略
request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;