GET请求和POST请求

来源:互联网 发布:在淘宝开店快递怎么弄 编辑:程序博客网 时间:2024/05/19 18:00

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].
    • 注意:
      • 不能在本地存储用户隐私数据的明文
      • 不能在网络上传输用户隐私数据的明文


1 0
原创粉丝点击