登录小案例
1. 相关知识点
- 发送POST请求的过程
- SVProgressHUD框架的使用
- 字符串截取处理
2. 业务逻辑
- 设置弹窗的样式
- 设置为正在登入时, 不可以再输入用户名和密码等信息
- 设置弹窗的的颜色
- 得到用户的输入
- 校验用户输入
- 用户名是否有输入,如果没有则 HUD 有相应的提示
- 密码是否有输入,如果没有则 HUD 有相应的提示
确定请求路径
用 post 请求, 用户名和密码是比较隐私
- 创建可变请求对象
- 修改请求方法
- 设置参数
- 中文转码
- 创建会话对象
- 创建 task
- task 回调解析响应数据
- 字符截串, 获得特定的数据 (这里可以不用这种方法)
- 注意: 在截取的时候不要将长度写死, 避免获取到不同结果时, 需要截取的长度不同的情况;
- 注意: 如果是返回的响应体的数据比较大的话, 那就不好截取了, 所以这种办法只用于小数据, 这里用下面方法
- 直接通过判断返回的数据包含的是 error 还是 success
- 弹窗提示用户登入是否成功
- 注意: 线程通信, 先回到主线程在做弹窗提示
- 处理弹窗中显示的内容
- 含有的是 error , 则调用的是showErrorWithStatus: 方法
- 含有的是 success, 则调用的是showSuccessWithStatus:方法
- 取消弹窗 HUD
- 注意: 线程通信, 先回到主线程在做取消弹窗
- 执行 task 任务
- 弹窗 HUD , 在 task 任务之后
- 弹窗添加显示文字 "正在登入..."
3. 实例代码
//
// ViewController.m
// 01-掌握-登录小案例
//
// Created by chendehao on 16/6/20.
// Copyright © 2016年 chendehao. All rights reserved.
//
#import "ViewController.h"
#import "SVProgressHUD.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *usernameTF;
@property (weak, nonatomic) IBOutlet UITextField *passwordTF;
@end
//模拟器切换到电脑键盘输入 shift + command + k
@implementation ViewController
- (IBAction)loginBtnClick:(id)sender{
//设置背景色和灰色HUD
[SVProgressHUD setDefaultMaskType:SVProgressHUDMaskTypeBlack];
[SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];
//1. 得到用户的输入
NSString *usernameStr = self.usernameTF.text;
NSString *passwordStr = self.passwordTF.text;
//2. 校验用户的输入
if (usernameStr.length == 0) {
[SVProgressHUD showErrorWithStatus:self.usernameTF.placeholder];
return;
}
if (passwordStr.length == 0) {
[SVProgressHUD showErrorWithStatus:self.passwordTF.placeholder];
return;
}
//确定请求路径
NSURL *url = [NSURL URLWithString:@"http://120.25.226.186:32812/login"];
//创建可变请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//修改请求方法
request.HTTPMethod = @"POST";
//设置参数 这里的 type 的参数可传可不传, 如果不传默认就 JSON
NSString *bodyStr = [NSString stringWithFormat:@"username=%@&pwd=%@&type=JSON",usernameStr,passwordStr];
request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];
//创建会话对象
NSURLSession *session = [NSURLSession sharedSession];
//创建Task
NSURLSessionDataTask *dataTsk =[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//解析数据
NSString *resultStr = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",resultStr);
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
NSString *msg = nil;
if ([resultStr containsString:@"error"]) {
msg = dict[@"error"];
[SVProgressHUD showErrorWithStatus:msg];
}else
{
msg = dict[@"success"];
[SVProgressHUD showSuccessWithStatus:msg];
}
/*
这里的'\' 是作为转译
NSUInteger loc = [resultStr rangeOfString:@":\""].location + 2;
NSUInteger len = [resultStr rangeOfString:@"\"}"].location - loc;
NSString *msg = [resultStr substringWithRange:NSMakeRange(loc, len)];
// // 注意: 一定要回到主线程取消蒙板
// dispatch_async(dispatch_get_main_queue(), ^{
// [SVProgressHUD dismiss];
// });
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if ([resultStr containsString:@"error"]) {
[SVProgressHUD showErrorWithStatus:msg];
}else{
[SVProgressHUD showSuccessWithStatus:msg];
}
});
*/
}];
//执行TASK
[dataTsk resume];
//弹出HUD
[SVProgressHUD showWithStatus:@"正在登陆..."];
}
// 所谓请求失败是没有拿到服务器发送过来的数据,
// 服务器想给请求者什么数据, 是服务器设置
@end