GET
GET 的本质是得
从服务器拿数据,效率更高
GET请求能够被缓存
在 HTTP 协议定义中,没有对 GET 请求的数据大小限制,不过因为浏览器不同,一般限制在2~8K之间
所有的参数包装在URL中,并且服务器的访问日志会记录,不要传递敏感信息
参数格式
在资源路径末尾添加?表示追加参数
每一个变量及值按照变量名=变量值方式设定,不能包含空格或者中文
多个参数使用&连接
URL 字符串中如果包含中文,需要添加百分号转义
POST
POST 的本质是给
向服务器发送数据,也可以获得服务器处理之后的结果,效率不如 GET
POST请求不能被缓存
POST提交数据比较大,大小靠服务器的设定值限制,PHP通常限定 2M
URL中,只有资源路径,但不包含参数,服务器日志不会记录参数,相对更安全
参数被包装成二进制的数据体,格式与 GET 基本一致,只是不包含?
所有设计用户隐私的数据(密码,银行卡号)一定记住使用POST方式传递
GET 缓存
Request 缓存请求头
If-None-Match- 与响应头的 Etag 相对应,可以判断本地缓存数据是否发生变化
GET 方法缓存演练
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event {
NSURL*url = [NSURLURLWithString:@"http://localhost/itcast/images/head1.png"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1timeoutInterval:10.0];
if(self.etag.length>0) {NSLog(@"%@",self.etag);
[request setValue:self.etagforHTTPHeaderField:@"If-None-Match"];
}
[NSURLConnectionsendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response,NSData*data,NSError*connectionError) {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;NSLog(@"%@", httpResponse);
// 判断服务器返回的状态码,是否是 304
if(httpResponse.statusCode==304) {NSLog(@"加载缓存数据");
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];
data = cachedResponse.data;
}
self.etag= httpResponse.allHeaderFields[@"Etag"];
self.iconView.image= [UIImageimageWithData:data];
}];}
代码小结
请求的缓存策略使用NSURLRequestReloadIgnoringCacheData,忽略本地缓存
服务器响应结束后,要记录Etag,服务器内容和本地缓存对比是否变化的重要依据
在发送请求时,设置If-None-Match,并且传入Etag
连接结束后,要判断响应头的状态码,如果是304,说明服务器内容没有发生变化
设置缓存
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4*1024*1024diskCapacity:20*1024*1024diskPath:nil];[NSURLCache setSharedURLCache:urlCache];
iOS 5.0开始,支持磁盘缓存,但仅支持 HTTP
iOS 6.0开始,支持 HTTPS 缓存
网友评论