本片文章重点介绍了NSURLRequest的配置,作为网络请求的主要载体,NSURLRequest的配置十分重要。本文会对创建请求,发送请求以及这个过程中的参数设置进行详细的解析。
1、NSURLRequest
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
|
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
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 2 3 4 5 6 7 8 9 10
| GET 所有的参数都包含在URL中,URL的格式如下 <1>login.php是负责登录的脚本(可以有很多种) <2>?表示脚本后面要接参数 <3>参数格式:参数名 = 值 <4>如果有多个参数,使用&连接,后续的参数仍按照“值对”方式定义 <5>如果URL字符串中包含中文或者空格等特殊符号,需要对URL字符串添 加百分号转义 POST:只是负责登录的脚本,其它参数无需确定
|
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字 符串添加“百分号转义”