NSURLRequest 详解

iOS基础

本片文章重点介绍了NSURLRequest的配置,作为网络请求的主要载体,NSURLRequest的配置十分重要。本文会对创建请求,发送请求以及这个过程中的参数设置进行详细的解析。

1、NSURLRequest

  • 1、创建方法
1
2
3
NSURLRequest *request = [NSURLRequest requestWithURL:url 
cachePolicy:0 timeoutInterval:2.0];

  • 2、参数介绍

    • 1、cachePolicy 缓存策略

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
       默认缓存策略
      NSURLRequestUseProtocolCachePolicy = 0,

      NSURLRequestReload(刷新)Ignoring(忽略)Local(本
      地)Cache(缓存)Data = 1,

      如果有缓存,返回缓存数据,否则加载
      NSURLRequestReturnCacheDataElseLoad = 2,

      如果有缓存,返回缓存数据,否则不加载
      NSURLRequestReturnCacheDataDontLoad = 3,

    • 2、timeoutInterval 超长时间

    
1
2
3
4
5
6
7
8
9
10
11

超长事件,访问一个服务器,如果在制定时间内服务器没有做
出响应,就放弃请求,默认时长是60s

一般在实际开发中,建议设置为15~30s,太短服务器可能来
不及做出响应,太长用户等待的事件又太长,影响用户体验

SDWebImage 默认时长就是 15s

AFNetworking 默认时长是 60s

  • 3、发送请求
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[NSURLConnection sendAsynchronousRequest:request
queue:[[NSOperationQueue alloc] init]
completionHandler:^(NSURLResponse *response,
NSData *data, NSError *connectionError) {

if (connectionError || data == nil) {
NSLog(@"你的网络不给力,请稍候再试!");
NSLog(@"===> %@", connectionError);
return;
}

NSString *json = [[NSString alloc]
initWithData:data
encoding:NSUTF8StringEncoding];

NSLog(@"%@", json);
}];

参数介绍

1、request

1
索要资源的请求队列

2、queue 调度任务的队列

1
2
3
4
5
6
7
8
指定调度回调块代码在哪个线程上执行
-主队列:回调的块代码在主线程上执行
-新建队列:就会在其他线程执行回调代码

选择的原则:

是否需要对返回的数据做耗时操作,如果直接更新UI可以使用主队列,否则建议新建队列

3、回调块代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
在网络请求结束后执行,已经获得了服务器返回的二进制

回调参数:

1、response(NSHTTPURLResponse):
-服务器的响应(一般只有在做下载的网络操作,才会使用的 response)

URL:
服务器返回的 URL,绝大多数是和请求的 URL 是一致的,有的时候会不
一样,"重定向"

MIMEType:
二进制数据的文件类型,服务器告诉客户端,可以使用什么软件,打开二进
制数据

textEncodingName:
文本编码名称,大多数都是 UTF8

expectedContentLength:
下载文件的长度!

suggestedFilename:
服务器建议保存的文件名

statusCode:
状态码,2XX OK,3XX 重定向,4XX 客户端错误,5XX 服务器错误!

allHeaderFields:
所有响应头的内容

2、data :
- 数据实体,程序员开发最关注的

数据的序列化:
NSArray *result = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:NULL];
可序列化数据的要求:
- 顶级节点是一个NSArray或者NSDictionary
- 所有对象是
NSString,NSNumber,NSArray,NSDictionary,NSNull
- 所有字典的key时NSString
- NSNumber 不能为空或者无穷大


3、connectionError
-连接错误 只要是网络开发,就有可能出现错误!在实际开发中,一定要对
错误进行处理!

错误处理:
if (connectionError || data == nil) {
NSLog(@"你的网络不给力,请稍候再试!");
NSLog(@"===> %@", connectionError);
return;
}

2、请求方式以及区别

1、请求类型的简单介绍

1
2
3
4
5
6
7
8
9
10
11
12
GET http://www.x.com/product/123 
语义:获取产品代号是123的商品信息

POST http://www.x.com/product/123
语义:新增产品代号是123的商品信息

PUT http://www.x.com/product/123
语义:修改产品代号是123的商品信息

DELETE http://www.x.com/product/123
语义:删除产品代号是123的商品信息

2、POST和GET在发送网络请求时的区别:

  • 1、URL
1
2
3
4
5
6
7
8
9
10

GET 所有的参数都包含在URL中,URL的格式如下
<1>login.php是负责登录的脚本(可以有很多种)
<2>?表示脚本后面要接参数
<3>参数格式:参数名 = 值
<4>如果有多个参数,使用&连接,后续的参数仍按照“值对”方式定义
<5>如果URL字符串中包含中文或者空格等特殊符号,需要对URL字符串添
加百分号转义
POST:只是负责登录的脚本,其它参数无需确定

  • 2、Request
1
2
3
4
5
6
7
8
9
10
11
12
13
GET 因为所有的参数URL中已经包含,request中无需指定任何内容
request的默认方法是GET GET效率最高,GET方法是使用最频繁的网络
方法

POST:
1、指定HTTPMethod 要想服务器“贴”数据,
request.HTTPMethod = "POST"
2、要设置请求体的二进制数据
提示:可以从firebug中直接粘贴,然后替换参数
格式:和GET方法中参数的格式一样,只是没有?
3、connection -将请求发送给服务器,等待服务器返回的响应和数
据实体在网络访问中,这个方法是最单纯的

GET和POST请求的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

1、GET的本质是“得” POST的本质是“给”

2、GET是从服务器拿数据,效率更高,POST是想服务器发送数据,
也可以获取服务器处理之后的结果,效果不如GET

3、GET请求能够被缓存(一个指定URL所代表的内容一般不会变)POST请求不
能被缓存
4、GET在HTTP协议中没有对GET请求的数据大小限制,不过因为浏览器的不同
一般限制在2-8K之间POST提交数据比较大,大小靠服务器设定值限制,
PHP通常限定2M
5、GET请求所有的参数包装在URL中,并且服务器的访问日志会记录,不要传递
敏感信息 POST:URL中只有资源路径,但不包含参数,服务器日志不会记 录参数相对更安全参数被包装成二进制的数据体,格式与GET基本一致,只
是不包含
6、GET的参数在资源路径末尾添加?表示追加参数,
参数:变量名=变量值不能包含空格或者中文,多个参数使用&连接POST需
要设置请求体


发送请求的URL字符串中,如果包含了中文或者空格等特殊符号,需要对URL字 符串添加“百分号转义”