GET请求和POST请求

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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值