网络03

GET请求模拟登录

- (IBAction)login:(id)sender
{
    // 从文本输入框获取用户名和密码 zhangsan zhang 张三
    NSString *name = self.nameTextField.text;
    NSString *password = self.passwordextField.text;
    
    // 拼接请求地址
    NSString *URLStr = [NSString stringWithFormat:@"http://localhost/php/login/login.php?username=%@&password=%@",name,password];
    
    // 转义查询字符串(参数)里面的中文 / 空格 / 特殊字符...
    // AFN自动帮助转义
    URLStr = [URLStr stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
    
    // 1.URL
    NSURL *URL = [NSURL URLWithString:URLStr];
    
    // 2.获取单例session,发起任务,启动任务 (默认就是GET请求)
    [[[NSURLSession sharedSession] dataTaskWithURL:URL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 3.处理响应
        if (error == nil && data != nil) {
            // 4.反序列化
            NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            // 5.判断是否登录成功
            if ([result[@"userId"] intValue] == 1) {
                NSLog(@"登录成功");
            } else {
                NSLog(@"登录失败");
            }
            
        } else {
            NSLog(@"%@",error);
        }
        
    }] resume];
}

以上需要注意的是
转义查询字符串(参数)里面的中文 / 空格 / 特殊字符...

URLStr = [URLStr stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet URLQueryAllowedCharacterSet]];

POST请求模拟登录

- (IBAction)login:(id)sender
{
    // 1.URL (POST请求的URL没有参数,参数封装在请求体)
    NSURL *URL = [NSURL URLWithString:@"http://localhost/php/login/login.php"];
    
    // 2.创建请求可变对象
    NSMutableURLRequest *requestM = [NSMutableURLRequest requestWithURL:URL];
    // 2.1 设置请求方法为POST
    requestM.HTTPMethod = @"POST";
    // 2.2 设置请求体 : 二进制的数据
    requestM.HTTPBody = [self getHTTPBody];
    
    // 2.获取单例session,发起任务,启动任务
    [[[NSURLSession sharedSession] dataTaskWithRequest:requestM completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        // 3.处理响应
        if (error == nil && data != nil) {
            // 4.反序列化
            NSDictionary *result = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            // 5.判断是否登录成功
            if ([result[@"userId"] intValue] == 1) {
                NSLog(@"登录成功");
                
                // 实际开法中,登录成功之后,需要把服务器返回的用户的数据保存在本地
                
            } else {
                NSLog(@"登录失败");
            }
            
        } else {
            NSLog(@"%@",error);
        }
        
    }] resume];
}

// 获取请求体二进制的主方法
- (NSData *)getHTTPBody
{
    // 浏览器检测到的请求体 : username=%E5%BC%A0%E4%B8%89&password=zhang
    
    // 拼接请求体字符串 : POST请求的请求里面的中文不需要转义
    NSString *body = [NSString stringWithFormat:@"username=%@&password=%@",self.nameTextField.text,self.passwordTextField.text];
    // 把请求体字符串转成二进制形式的请求体;dataUsingEncoding : 直接把字符串转成二进制
    NSData *HTTPBody = [body dataUsingEncoding:NSUTF8StringEncoding];
    
    return HTTPBody;
}

你可能感兴趣的:(网络03)