一、网络访问流程
1、指定资源路径NSURL
1>URL是依赖于服务器上的资源的,不能随意修改
2>就是一个能够指定服务器资源的路径字符串
2、封装连接请求NSURLRequest/NSMutableRequest
1>GET请求URL组成
url字符串+?+参数
a.用NSRequest封装请求,就是创建请求对象
NSString *urlString = [NSString stringWithFormat:@"http://192.168.19.45/login.php?username=%@&password=%@", name, pwd];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
b.“?”表示后面紧跟若干参数
c.多个参数用&连接
d.参数格式:变量名=数值
2>POST请求
a.用NSMutableRequest封装请求,创建请求对象
NSURL *url = [NSURL URLWithString:@"http://192.168.19.45/login.php"];
i>简单方法
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
ii>参数较多方法
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:30];建议使用30s以提高用户体验
requestWithURL 参数:
cachePolicy(策略)
NSURLRequestUseProtocolCachePolicy = 0, // 默认
NSURLRequestReloadIgnoringLocalCacheData = 1, // 忽略本地数据,每次都从网络加载
// 实时更新要求强的,股票,球赛,彩票
NSURLRequestReloadIgnoringLocalAndRemoteCacheData = 4, // Un(没有)implemented(实现)
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData,
// 同选项 1
// 做本地缓存以及“离线”数据需要使用,用户手机没有上网,打开之后,又希望用户不要太无聊
// 使用场景,需要判断用户当前手机的联网状态,根据联网状态来判断具体的缓存策略
// 提示:尽量不要做支持离线的应用!尽量要把用户拉到网上来,只有上网了,才有办法挣钱!
NSURLRequestReturnCacheDataElseLoad = 2, // 如果有缓存,就用缓存,否则上网
NSURLRequestReturnCacheDataDontLoad = 3, // 只返回缓存数据,不上网
NSURLRequestReloadRevalidatingCacheData = 5, // Unimplemented
timeoutInterval: 访问网络的超时时长,当超过指定时间后,提示用户!
在iOS的网络请求中,默认的超时时长是 60 秒,建议的超时时长可以调整到20~30秒,可以提高用户体验
b.指定网络请求的方法(设置HTTPMethd属性)
c.设置数据体属性(设置参数)
i>参数的设置是通过数据体实现的
ii>参数的格式是与GET格式一样的
iii>实现办法就是给请求的HTTPBoby属性赋值(NSData类型的,通常用字符串转过去的)
// 2.2 数据体,通过firebug跟踪,格式和get的格式是一样的
NSString *bodyStr = [NSString stringWithFormat:@"username=%@&password=%@", name, pwd];
// 通过设置HTTPBody属性,就能够设置请求中要发送给服务器的参数
// 将NSString 转换成 NSData
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
3、向服务器发送连接请求,并或得服务器返回的二进制数据NSURLConection
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//一些处理操作
}];
参数解析
queue:标识的是后面的completionHandler块代码执行队列,并不是用来表示网络连接操作的,事实上只要使用了sendAsynchronousRequest:::的方法连接网络,网络请求的过程会被自动放入新的线程异步执行
[[NSOperationQueue alloc] init] - 异步执行块代码
[NSOperationQueue mainQueue] - 主线程执行块代码
举例:在网络访问结束后,有时候,会做后续的耗时操作的处理,例如:从网络下载一个压缩文件,
在完成块代码中,需要首先解压缩文件-耗时的操作,不需要UI更新,此时可以指定异步执行
二、注意
1、在使用GET的时候不需要指定网络请求的方法是GET还是POST,因为默认的方法就是GET,但是在使用POST的时候一定指定网络请求的方法
2、GET和POST都可以设定参数,但是参数的设置时机不一样,GET将参数封装在url中,很不安全,POST则是封装在数据体中相对安全的多(url是很容易拿到的,拿到服务器的请求日志,一目了然)
2、POST请求的封装要使用NSMuatbbleRequest,因为要指定请求的方法和数据体
3、POST方法体是二进制数据dataUsingEncoding:
4、网络返回的也是二进制数据,要经过处理才能使用的
5、GET比POST的效率高,通常使用GET,但是一旦是涉及到用户的隐私的东西一定使用POST(银行卡号,密码)