task类的结构.png
一 基本的 NSURLSession 请求
-(void)session_get{
// 1.设置路径
NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=12345";
NSURL *url = [NSURL URLWithString:urlStr];
// 2.创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.创建一个会话对象 session
NSURLSession *session = [NSURLSession sharedSession];
// 4.设置一个任务
/** 说明文字
request 请求对象
data 相应的数据
response 相应头
error 错误
*/
// 因为没有设置队列,系统默认在子线程中调用
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
//5. 开始任务
[dataTask resume];
}
-(void)session_get{
// 1.设置路径
NSString *urlStr = @"http://120.25.226.186:12345/logo?usr=zhangsan&pwd=12345";
NSURL *url = [NSURL URLWithString:urlStr];
// 2.创建请求
//3.创建一个会话对象 session
NSURLSession *session = [NSURLSession sharedSession];
// 4.设置一个任务
// 这个方法内部会自动创建请求头
// 因为没有设置队列,系统默认在子线程中调用
NSURLSessionDataTask *dataTask = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
//5. 开始任务
[dataTask resume];
}
-(void)session_POST{
// 1.设置路径
NSString *urlStr = @"http://120.25.226.186:12345/logo";
NSURL *url = [NSURL URLWithString:urlStr];
// 2.创建请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//3. 设置请求的方法
request.HTTPMethod = @"POST";
//4. 设置请求体
request.HTTPBody = [@"usr=zhangsan&pwd=12345" dataUsingEncoding:NSUTF8StringEncoding];
//3.创建一个会话对象 session
NSURLSession *session = [NSURLSession sharedSession];
// 4.设置一个任务
/** 说明文字
request 请求对象
data 相应的数据
response 相应头
error 错误
*/
// 因为没有设置队列,系统默认在子线程中调用
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}];
//5. 开始任务
[dataTask resume];
}
三 基本的 NSURLSession 请求
1> 最主要的区别就是对参数的处理上,get请求的参数和url在一起,post 请求url 和请求参数是分开的,请求参数是放在请求体里的.
2> 请求参数的大小有区别,get 最多通常1kb, post 通常没有限制.
3> post 请求必须要使用NSMutableURLRequest
具体URL格式如下:
4> get 的url http://主机地址/路径?请求参数
5> post的url http://主机地址/路径
- 请简单列出NSURLConnection发送一个异步POST请求的步骤?
- 1 创建请求URL
- 2 创建NSMutableRequest
- 3 设置request 方法 httpMethod
- 4 发送请求
1> 通过url 的主机地址和端口号找到通行的目标 建立tcp 3次握手
2> 客户端发送请求头和请求体(post)告诉服务器客户端的环境和请求的具体参数
3> 服务端根据客户端的请求头和请求体做出具体的相应,首先回应响应头(服务器端的状态环境及将要传送的数据的格式).
4> 客户端接收服务端的数据完成请求.
- 请简单说下NSURLSession对比NSURLConnection 的优势
1> session 支持http2.0 协议(iOS9.0+)
2> 在处理下载任务的时候可以直接把数据下载到磁盘
3> 支持后台下载 | 上传 (NSURLConnection 是无法实现的)
4> 同一个session 发送多个请求,只需要建立一次连接(复用了tcp)
5> 提供了全局的session 并且可以统一配置,使用更加方便
6>下载的时候是多线程异步处理的效率更高
- 请简单列出NSURLSession 发送POST的简单步骤?
1> 创建请求URL
2> 创建NSMutableURLRequest 请求
3> 设置request 请求的方法 HttpMethod
4> 设置request的请求体 httpBody
5> 创建NSURLSession, [NSURLSession shareSession]
6> 使用session 创建一个dataTask 任务
7> [dataTask resume] 发出请求
- 使用NSURLSession 发送网络请求时,最多可以建立多少个Tcp连接
1> 在iOS中最多建立4个tcp连接,osX中最多可以建立6个连接.
2> 在iOS中,NSURLSessionConfiguration 中 HTTPMaximumConnectionsPerHost 用来设置最大连接主机数 有说明 //The default value is 6 in macOS, or 4 in iOS.;
说明:
1>由于HTTP/1.1 不支持多路复用,因此如果要处理多个网络请求,在处理http请求的时候,多数浏览器厂商都是不假思索的就在客户端排队所有的HTTP请求,然后通过一个持久连接,一个接着一个的发送这些请求.然而这种方式实在太差.实际上,浏览器开发商对于此性能问题,尚没有任何更好的办法,因此只能允许客户端并行打开多个tcp连接会话.但是具体最多可以打开多少个tcp连接是有数量限制的.多数现代浏览器,包括桌面和移动浏览器,都支持打开6个连接,即客户端对多可以并发分派6个请求,服务器可以并发处理6个请求.
2> 为什么是6个连接? 有什么特殊含义吗?
其实这个数字是多方平衡后的结果,这个数字越大,便能带来更多的并行能力,但同样的客户端和服务端占用的资源也会越多.因此主机6个只是大家觉得比较安全能够接受的一个数字而已.
网友评论