iOS中的HTTP请求处理
来源:互联网 发布:文字抽奖软件 编辑:程序博客网 时间:2024/06/05 16:39
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"];
普通的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;
/**
* Author:Jn
* GitHub:https://github.com/JnKindle
* cnblogs:http://www.cnblogs.com/JnKindle
* QQ:1294405741
*/
- iOS中的HTTP请求处理
- python处理http请求中的protobuf
- iOS网络请求中的错误处理
- iOS 自动处理 Http 请求的应答内容字符编码
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http 请求处理流程
- Http请求处理流程
- Http请求处理流程
- Http请求处理流程
- 基于飞思卡尔imx6 sabrelite开发板的android lvds屏幕驱动调试
- Linux操作系统发展历程及系统版本选择
- Java编程思想解析 第1章 对象导论 1.1 抽象过程
- jzoj 4933. 【NOIP2017提高组模拟12.24】C 线段树
- Leetcode Remove Duplicates from Sorted List II
- iOS中的HTTP请求处理
- zigbee zcl规范及其协议栈实现1
- 编程之美(数字的魅力--寻找发帖水王)
- NoiOpenJudge 1.5津津的储蓄计划
- zigbee zcl规范及其协议栈实现2
- Java回调通俗理解
- JAVA_IO流
- 起点?还是终点?——2016年终总结
- Django实现发送邮件功能