网络基础编程3
http长用的方法
GET
- GET 的本质是"得"
- 从服务器拿数据,效率更高
- 从数学的角度来讲,GET 的结果是"幂等"的
- GET请求能够被缓存
- 在 HTTP 协议定义中,没有对 GET 请求的数据大小限制,不过因为浏览器不同,一般限制在 2~8K 之间
- 所有的参数包装在URL中,并且服务器的访问日志会记录,不要传递敏感信息
- 参数格式
- 在资源路径末尾添加
?
表示追加参数 - 每一个变量及值按照
变量名=变量值
方式设定,不能包含空格或者中文 - 多个参数使用&连接
-
URL 字符串
中如果包含中文,需要添加百分号转义
- 在资源路径末尾添加
POST
- POST 的本质是"给"
- 向服务器发送数据,也可以获得服务器处理之后的结果,效率不如 GET
- POST请求不能被缓存
- POST提交数据比较大,大小靠服务器的设定值限制,PHP通常限定 2M
- URL中,只有资源路径,但不包含参数,服务器日志不会记录参数,相对更安全
- 参数被包装成二进制的数据体,格式与 GET 基本一致,只是不包含
?
- 所有设计用户隐私的数据(密码,银行卡号)一定记住使用
POST
方式传递
GET 缓存
GET 方法
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSURL *url = [NSURL URLWithString:@"http://localhost/itcast/images/head1.png"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:1 timeoutInterval:10.0];
if (self.etag.length > 0) {
NSLog(@"%@", self.etag);
[request setValue:self.etag forHTTPHeaderField:@"If-None-Match"];
}
[NSURLConnection sendAsynchronousRequest: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];
self.iconView.image = [UIImage imageWithData:cachedResponse.data];
return;
}
self.etag = httpResponse.allHeaderFields[@"Etag"];
self.iconView.image = [UIImage imageWithData:data];
}];
}
Request 缓存请求头
-
If-None-Match
- 与响应头的 Etag 相对应,可以判断本地缓存数据是否发生变化
设置缓存
在appdelegate里边设置网络缓存的大小
NSURLCache *urlCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:nil];
[NSURLCache setSharedURLCache:urlCache];
- iOS 5.0开始,支持磁盘缓存,但仅支持 HTTP
- iOS 6.0开始,支持 HTTPS 缓存
GET & POST 登录
基本代码
GET 登录
// MARK: - GET 登录
- (void)getLogin {
NSString *username = @"zhangsan";
NSString *pwd = @"zhang";
NSString *urlString = [NSString stringWithFormat:@"http://localhost/login.php?username=%@&password=%@", username, pwd];
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:2 timeoutInterval:10.0];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@ - %@", response, result);
}];
}
POST 登录
// MARK: POST 登录
- (void)postLogin {
NSString *username = @"zhangsan";
NSString *pwd = @"zhang";
NSURL *url = [NSURL URLWithString:@"http://localhost/login.php"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:2 timeoutInterval:10.0];
request.HTTPMethod = @"POST";
NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@", username, pwd];
request.HTTPBody = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
id result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"%@ - %@", response, result);
}];
}
GET & POST 对比
URL
-
GET - 真正的变化都在 URL 中
- URL 格式
- login.php 负责登录的脚本(提示,服务器脚本可以有很多种,php是上课使用的一种)
- 如果接参数,使用
?
- 参数格式,值对:
参数名=值
- 多个参数,使用
&
连接 - 如果 URL 字符串中有中文/空格等特殊字符,需要添加百分号转义
- URL 格式
-
POST
- URL 中不包含任何参数,直接指定脚本路径即可
Request
-
GET - 是网络访问使用频率最高的方法,从服务器获取数据,
URLRequest
的默认方法就是GET
- 不需要做任何改动
-
POST
- 需要指定 HTTP 的访问方法:POST
- 所有的数据参数都在数据体中指定,数据内容可以从
Firebug
中粘贴 - 数据格式和
GET
方法的参数定义非常类似,没有?
Connection
- 将
请求
发送给服务器 - 返回服务器的二进制数据实体
- 是网络访问中,最单纯的方法
- 无论
GET
还是POST
方法,Connection 没有变化
GET & POST 补充
百分号转义
-
GET
方法的 URL 中如果包含中文或者特殊字符,需要添加百分号转义 -
POST
方法不需要添加百分号转义
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
缓存(知道就好)
- GET 能够缓存
- POST 不能缓存
缓存
- GET 能够缓存
- POST 不能缓存
总结:通过本篇博客我们学习到了get,post登陆,和get,post缓存的设置,和get我们从网络上加载数据实时更新,因为默认是从网络上加载数据,我们需要设置一个If-None-Match的值,post没有本地缓存所以我们不需要设置,也学习到了get,post请求的一些区别,get的请求速度快,但是不安全,post的把所有的数据都封装在请求头里边所以比较安全