HTTP 的常用方法
在 HTTP/1.1 协议中,定义了 9 种发送 http 请求的方法
- GET
- POST
- HEAD
- PUT
- DELETE
- OPTIONS
- TRACE
- CONNECT
- PATCH(新引入)
- 以上几种方法仅供参考了解,http 请求的方法里面该如何实现交由服务器处理,客户端只需要发送对应请求即可。在以后的开发中最常用的是
GET
和POST
GET和POST请求简介
- GET和POST请求,是HTTP协议下常用的两种请求网络数据的方法.
GET请求
GET
的本质是得
.- 从服务器获取数据,效率比
POST
高. - GET请求能够被缓存
- 在 HTTP 协议定义中,没有对
GET
请求的数据大小限制,不过因为浏览器不同一般限制在2~8K
之间. - GET发送请求时,URL中除了资源路径以外,所有的参数(查询字符串)也包装在URL中,并且服务器的访问日志会记录,不要传递敏感信息.
- 参数格式
- 在资源路径末尾添加
?
表示追加参数. - 每一个变量及值按照
变量名=变量
值 方式设定,不能包含空格或者中文. - 多个参数使用
&
连接. - 注意 : URL 字符串中如果包含空格或者中文,需要添加百分号转义.
- 在资源路径末尾添加
浏览器可以监视
GET
请求.POST请求
POST
的本质是给
.- 向服务器发送数据,也可以获得服务器处理之后的结果,效率不如
GET
. - POST请求不能被缓存.
- POST提交数据比较大,大小靠服务器的设定值限制,PHP通常限定 2M.
- POST发送请求时,URL中只有资源路径,但不包含参数,服务器日志不会记录参数,
相对更安全
. - 参数被包装成二进制的数据体,格式与 GET 基本一致,只是
不包含 ?
. - 注意 : 所有涉及到
用户隐私
的数据(密码,银行卡号)一定记住使用POST
方式传递.
浏览器可以监视
POST
请求.但是不容易捕捉到.
一.GET请求模拟登陆
GET请求模拟登陆代码实现
- (IBAction)login:(id)sender { // 获取用户名 NSString *userName = @"zhangsan"; // 获取密码 NSString *psd = @"zhang"; // 拼接链接 NSString *urlStr = [NSString stringWithFormat:@"http://localhost/php/login.php?username=%@&password=%@",userName,psd]; // URL参数中如果有汉字,空格需要进行特殊处理.否则,创建NSURL会返回nil. urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]]; // 获取URL NSURL *url = [NSURL URLWithString:urlStr]; // 创建请求 NSURLRequest *request = [NSURLRequest requestWithURL:url]; // 发送异步请求,请求自建服务器中的demo.json数据 [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 判断链接是否错误 if (connectionError) { NSLog(@"链接错误 %@",connectionError); return; } // 检查响应体是否有错 NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) { // 判断登陆是否成功 NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; if ([jsonDict[@"userId"] intValue] == 1) { NSLog(@"登陆成功"); } else { NSLog(@"登录失败"); } } else { NSLog(@"服务器内部错误"); return; } }]; }
- URL参数中如果有汉字,空格需要进行特殊处理.否则,创建NSURL会返回nil.
// 此方法在iOS9中过时 urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // 此方法可以设置哪些字符进行%转义和哪些不进行%转义 // URLQueryAllowedCharacterSet : 对URL中问号后面的查询字符串进行转义. urlStr = [urlStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
GET请求时的URL/地址
- 资源路径 :
http://localhost/php/login.php
-
资源路径后面如果要带参数(查询字符串),使用
?
衔接. -
参数格式 :
参数名=值
. -
如果有多个参数,使用
&
连接.username=zhangsan&password=zhang
GET请求模拟登陆时完整的地址 :
// GET请求时的地址 http://localhost/php/login/login.php?username=zhangsan&password=zhang
二.POST请求模拟登陆
搭建登陆界面
代码实现
- 准备控件
@interface ViewController () @property (weak, nonatomic) IBOutlet UITextField *userNameTextField; @property (weak, nonatomic) IBOutlet UITextField *psdTextField; @end
- 登陆操作
- (IBAction)login:(id)sender { // 获取用户名和密码 NSString *userName = self.userNameTextField.text; NSString *psd = self.psdTextField.text; // 获取URL NSURL *url = [NSURL URLWithString:@"http://localhost/php/login.php"]; // 创建请求 // NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:url]; // 设置POST请求 requestM.HTTPMethod = @"POST"; NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",userName,psd]; requestM.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding]; // 发送异步请求,请求自建服务器中的demo.json数据 [NSURLConnection sendAsynchronousRequest:requestM queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) { // 判断链接是否错误 if (connectionError) { NSLog(@"链接错误 %@",connectionError); return; } // 检查响应体是否有错 NSHTTPURLResponse *HTTPURLResponse = (NSHTTPURLResponse *)response; if (HTTPURLResponse.statusCode == 200 || HTTPURLResponse.statusCode == 304) { // 判断登陆是否成功 NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL]; if ([jsonDict[@"userId"] intValue] == 1) { NSLog(@"登陆成功"); } else { NSLog(@"登陆失败"); } } else { NSLog(@"服务器内部错误"); return; } }]; }
POST请求时的URL/地址
-
URL/地址里面只有资源路径 :
http://localhost/php/login.php
-
参数,查询字符串,请求信息都在请求体里面
requestM.HTTPMethod = @"POST"; NSString *body = [NSString stringWithFormat:@"username=zhangsan&password=zhang"]; requestM.HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
GET & POST 对比
-
GET请求模拟登陆时的地址
http://localhost/php/login/login.php?username=zhangsan&password=zhang
-
POST请求模拟登陆时的地址
http://localhost/php/login/login.php
-
GET请求 :
- URL 中在指定资源路径后面,包含了所有参数(查询字符串).
GET
是网络访问使用频率最高的方法.从服务器获取数据默认方法就是 GET.
-
POST请求 :
- URL 中不包含任何参数,直接指定资源路径即可.没有 ?.
POST
请求 需要指定HTTP
的访问方法为:@"POST"
.- 所有的参数都在请求体中指定
三.保存用户信息
- 在做账号体系开发时,用户登录成功之后需要将服务器返回的用户信息保存起来.
- 比如 : 可以实现自动登录.而且用户的基本信息在程序的其他地方也可能会用到.
此处以保存用户名和密码为例
- 数据量比较小,保存在用户偏好设置里.
- 如果要保存大量的用户信息,可以选择数据库保存或者用户信息模型类归档...
代码实现
#define userNameKey @"userName" #define psdKey @"psd"
/// 登陆成功之后,保存用户信息 - (void)saveUserInfo { [[NSUserDefaults standardUserDefaults] setObject:self.userNameTextField.text forKey:userNameKey]; [[NSUserDefaults standardUserDefaults] setObject:self.psdTextField.text forKey:psdKey]; } /// 程序再次启动时,读取用户信息自动填充 - (void)readUserInfo { self.userNameTextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:userNameKey]; self.psdTextField.text = [[NSUserDefaults standardUserDefaults] objectForKey:psdKey]; }
- 登陆成功之后,调用
saveUserInfo
方法. - 再次启动程序时,在
viewDidLoad
里面调用readUserInfo
方法. - 注意 : iOS 8.0 会直接写入沙盒,无需再使用 [defaults synchronize].
- 注意:
- 不能在本地存储用户隐私数据的明文
- 不能在网络上传输用户隐私数据的明文