IOS学习 网络HTTP Get和Post请求与登录界面加密 涉及按钮边框圆角与颜色设置
2016-04-26 22:24
681 查看
#import "ViewController.h"
#import "NSString+Hash.h"
#define kusernameKey @"usernameKey"
#define kpasswordKey @"passwordKey"
@interface
ViewController ()
@property(nonatomic,retain)UITextField
*nameFd;
@property(nonatomic,retain)UITextField
*pwdFd;
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self
login];
}
-(void)login{
_nameFd = [[UITextField
alloc]initWithFrame:CGRectMake(20,
60,self.view.bounds.size.width
- 40,
40)];
_nameFd.placeholder =
@"请输入用户名";
_nameFd.borderStyle =
UITextBorderStyleRoundedRect;
[self.view
addSubview:_nameFd];
_pwdFd = [[UITextField
alloc]initWithFrame:CGRectMake(20,
140,
self.view.bounds.size.width
- 40,
40)];
_pwdFd.placeholder =
@"请输入登入密码";
_pwdFd.borderStyle =
UITextBorderStyleRoundedRect;
//是否安全输入,如果是的,输入内容将为“点”
_pwdFd.secureTextEntry =
YES;
[self.view
addSubview:_pwdFd];
UIButton *loginBtn = [[UIButton
alloc]initWithFrame:CGRectMake(20,
220, self.view.bounds.size.width-40,
40)];
[loginBtn setTitle:@"登入"
forState:UIControlStateNormal];
loginBtn.backgroundColor = [UIColor
purpleColor];
loginBtn.layer.cornerRadius =
8; //按钮圆角
//按钮的边框颜色设置:必须加CGColor
loginBtn.layer.borderWidth =
4;
loginBtn.layer.borderColor = [UIColor
greenColor].CGColor;
[loginBtn addTarget:self
action:@selector(loginAction)
forControlEvents:UIControlEventTouchUpInside];
[self.view
addSubview:loginBtn];
[self
loadUserInfo];
}
// 从偏好设置中取出账号和密码
- (void)loadUserInfo
{
NSString *username = [[NSUserDefaults
standardUserDefaults]
objectForKey:kusernameKey];
NSString *passeord = [[NSUserDefaults
standardUserDefaults]
objectForKey:kpasswordKey];
if (username.length && passeord.length) {
// 如果有值,直接取出来!
self.nameFd.text = username;
self.pwdFd.text = passeord;
}
}
//点击按钮:登入事件
-(void)loginAction{
// 客户端跟服务器交互:
如果不写这一句:
用户可以随意访问服务器的这个接口!
// 有些业务逻辑!
是交给服务器处理还是在客户端处理?
// 复杂的业务逻辑,尽量交给服务器来处理;如果涉及到数据(同步),也交给服务器处理!
// 客户端处理:
判断电话号码是否合法/判断用户是否输入信息等等...
前段处理可以较少服务器的压力!
if (!self.nameFd.text.length
&& !self.pwdFd.text.length)
{
NSLog(@"请输入账号和密码");
}else
{
// 1.创建请求 (POST请求)
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];
// 设置请求方法:
request.HTTPMethod =
@"POST";
// 对密码进行加密之后,再发送!
NSString *password = [self.pwdFd.text
md5String];
NSString *bodyStr = [NSString
stringWithFormat:@"username=%@&password=%@",self.nameFd.text,password];
// 设置请求体:
request.HTTPBody =[bodyStr
dataUsingEncoding:NSUTF8StringEncoding];
// 2. 发送请求
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
if (data) {
// NSLog(@"data:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// 解析 JSON
数据
NSDictionary *dict = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:NULL];
NSLog(@"%@",dict[@"userId"]);
if (dict[@"userId"]) {
// 如果服务器返回了 userId
说明账号密码正确,登陆成功!
NSLog(@"登陆成功!");
// 如果登陆成功,用户再次进入程序的时候,就不需要再次输入账号和密码了!需要在本地存储一下账号和密码!
[self
saveUserInfo];
}else
{
NSLog(@"账号或者密码错误");
}
}else
{
NSLog(@"连接错误,请重新尝试连接服务器");
}
}] resume];
}
}
// 将密码保存在偏好设置中
- (void)saveUserInfo
{
// 不能直接以密码明文的形式保存密码,需要加密之后再保存
// 将密码进行 MD5
加密
NSString *password = [self.pwdFd.text
md5String];
// 单例.
// NSUserDefaults *users = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults
standardUserDefaults]
setObject:self.nameFd.text
forKey:kusernameKey];
[[NSUserDefaults
standardUserDefaults]
setObject:password forKey:kpasswordKey];
[[NSUserDefaults
standardUserDefaults]
synchronize];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event{
// [self demo2];
}
//Get请求方法:带参数的网络请求!(如果需要上传参数给服务器)
-(void)demo1{
/*
1.参数格式: key=value (key:服务器接受参数的key值,在实际开发中,后端人员/接口文档中会告诉你.
value:就是需要告诉服务器的具体参数内容)
2.一般情况下,服务器需要我们提供多个参数!
参数和参数之间以 &
分隔 username=zhangsan&password=zhang
1.第一种告诉服务器参数的方法:
将参数拼接在 url
中!
注意:在 ?
后面拼接参数!
一个 url
中, ?
后面的内容都是参数!
GET :http请求方法,从服务器获取数据!
如果使用 get
请求发送参数给服务器,需要将参数拼接在 url
中!
缺点:
所有的参数都在 url
中.
信息不安全! */
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.html?username=zhangsan&password=zhang"];
NSURLRequest *request = [NSURLRequest
requestWithURL:url];
// 2. 发送请求
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// 处理服务器返回的数据!
NSLog(@"data:%@",[[NSString
alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}] resume];
}
//POST 请求
-(void)demo2{
// 1. 创建请求:由于 POST
请求需要手动指定 http
的请求方法为 POST ,所以只能用
可变请求!
// 接口
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];
// 设置请求方法为 POST ;
默认情况下,所有的请求都是 GET
请求.
request.HTTPMethod =
@"POST";
// POST 请求的参数,都是放在请求体中的!
注意:请求体式二进制数据!
// 设置请求体内容:
NSString *str = [NSString
stringWithFormat:@"username=zhangsan&password=zhang"];
// 将请求体字符串转换成二进制数据
NSData *data = [str
dataUsingEncoding:NSUTF8StringEncoding];
//放入请求体
request.HTTPBody = data;
// 2. 发送请求 // POST
请求只能使用下面这个方法!
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
//处理服务器返回的数据
NSLog(@"data:%@",[[NSString
alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}] resume];
}
#import "NSString+Hash.h"
#define kusernameKey @"usernameKey"
#define kpasswordKey @"passwordKey"
@interface
ViewController ()
@property(nonatomic,retain)UITextField
*nameFd;
@property(nonatomic,retain)UITextField
*pwdFd;
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self
login];
}
-(void)login{
_nameFd = [[UITextField
alloc]initWithFrame:CGRectMake(20,
60,self.view.bounds.size.width
- 40,
40)];
_nameFd.placeholder =
@"请输入用户名";
_nameFd.borderStyle =
UITextBorderStyleRoundedRect;
[self.view
addSubview:_nameFd];
_pwdFd = [[UITextField
alloc]initWithFrame:CGRectMake(20,
140,
self.view.bounds.size.width
- 40,
40)];
_pwdFd.placeholder =
@"请输入登入密码";
_pwdFd.borderStyle =
UITextBorderStyleRoundedRect;
//是否安全输入,如果是的,输入内容将为“点”
_pwdFd.secureTextEntry =
YES;
[self.view
addSubview:_pwdFd];
UIButton *loginBtn = [[UIButton
alloc]initWithFrame:CGRectMake(20,
220, self.view.bounds.size.width-40,
40)];
[loginBtn setTitle:@"登入"
forState:UIControlStateNormal];
loginBtn.backgroundColor = [UIColor
purpleColor];
loginBtn.layer.cornerRadius =
8; //按钮圆角
//按钮的边框颜色设置:必须加CGColor
loginBtn.layer.borderWidth =
4;
loginBtn.layer.borderColor = [UIColor
greenColor].CGColor;
[loginBtn addTarget:self
action:@selector(loginAction)
forControlEvents:UIControlEventTouchUpInside];
[self.view
addSubview:loginBtn];
[self
loadUserInfo];
}
// 从偏好设置中取出账号和密码
- (void)loadUserInfo
{
NSString *username = [[NSUserDefaults
standardUserDefaults]
objectForKey:kusernameKey];
NSString *passeord = [[NSUserDefaults
standardUserDefaults]
objectForKey:kpasswordKey];
if (username.length && passeord.length) {
// 如果有值,直接取出来!
self.nameFd.text = username;
self.pwdFd.text = passeord;
}
}
//点击按钮:登入事件
-(void)loginAction{
// 客户端跟服务器交互:
如果不写这一句:
用户可以随意访问服务器的这个接口!
// 有些业务逻辑!
是交给服务器处理还是在客户端处理?
// 复杂的业务逻辑,尽量交给服务器来处理;如果涉及到数据(同步),也交给服务器处理!
// 客户端处理:
判断电话号码是否合法/判断用户是否输入信息等等...
前段处理可以较少服务器的压力!
if (!self.nameFd.text.length
&& !self.pwdFd.text.length)
{
NSLog(@"请输入账号和密码");
}else
{
// 1.创建请求 (POST请求)
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];
// 设置请求方法:
request.HTTPMethod =
@"POST";
// 对密码进行加密之后,再发送!
NSString *password = [self.pwdFd.text
md5String];
NSString *bodyStr = [NSString
stringWithFormat:@"username=%@&password=%@",self.nameFd.text,password];
// 设置请求体:
request.HTTPBody =[bodyStr
dataUsingEncoding:NSUTF8StringEncoding];
// 2. 发送请求
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
if (data) {
// NSLog(@"data:%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// 解析 JSON
数据
NSDictionary *dict = [NSJSONSerialization
JSONObjectWithData:data
options:0
error:NULL];
NSLog(@"%@",dict[@"userId"]);
if (dict[@"userId"]) {
// 如果服务器返回了 userId
说明账号密码正确,登陆成功!
NSLog(@"登陆成功!");
// 如果登陆成功,用户再次进入程序的时候,就不需要再次输入账号和密码了!需要在本地存储一下账号和密码!
[self
saveUserInfo];
}else
{
NSLog(@"账号或者密码错误");
}
}else
{
NSLog(@"连接错误,请重新尝试连接服务器");
}
}] resume];
}
}
// 将密码保存在偏好设置中
- (void)saveUserInfo
{
// 不能直接以密码明文的形式保存密码,需要加密之后再保存
// 将密码进行 MD5
加密
NSString *password = [self.pwdFd.text
md5String];
// 单例.
// NSUserDefaults *users = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults
standardUserDefaults]
setObject:self.nameFd.text
forKey:kusernameKey];
[[NSUserDefaults
standardUserDefaults]
setObject:password forKey:kpasswordKey];
[[NSUserDefaults
standardUserDefaults]
synchronize];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent
*)event{
// [self demo2];
}
//Get请求方法:带参数的网络请求!(如果需要上传参数给服务器)
-(void)demo1{
/*
1.参数格式: key=value (key:服务器接受参数的key值,在实际开发中,后端人员/接口文档中会告诉你.
value:就是需要告诉服务器的具体参数内容)
2.一般情况下,服务器需要我们提供多个参数!
参数和参数之间以 &
分隔 username=zhangsan&password=zhang
1.第一种告诉服务器参数的方法:
将参数拼接在 url
中!
注意:在 ?
后面拼接参数!
一个 url
中, ?
后面的内容都是参数!
GET :http请求方法,从服务器获取数据!
如果使用 get
请求发送参数给服务器,需要将参数拼接在 url
中!
缺点:
所有的参数都在 url
中.
信息不安全! */
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.html?username=zhangsan&password=zhang"];
NSURLRequest *request = [NSURLRequest
requestWithURL:url];
// 2. 发送请求
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
// 处理服务器返回的数据!
NSLog(@"data:%@",[[NSString
alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}] resume];
}
//POST 请求
-(void)demo2{
// 1. 创建请求:由于 POST
请求需要手动指定 http
的请求方法为 POST ,所以只能用
可变请求!
// 接口
NSURL *url = [NSURL
URLWithString:@"http://127.0.0.1/httpLogin/login.php"];
NSMutableURLRequest *request = [NSMutableURLRequest
requestWithURL:url];
// 设置请求方法为 POST ;
默认情况下,所有的请求都是 GET
请求.
request.HTTPMethod =
@"POST";
// POST 请求的参数,都是放在请求体中的!
注意:请求体式二进制数据!
// 设置请求体内容:
NSString *str = [NSString
stringWithFormat:@"username=zhangsan&password=zhang"];
// 将请求体字符串转换成二进制数据
NSData *data = [str
dataUsingEncoding:NSUTF8StringEncoding];
//放入请求体
request.HTTPBody = data;
// 2. 发送请求 // POST
请求只能使用下面这个方法!
[[[NSURLSession
sharedSession] dataTaskWithRequest:request
completionHandler:^(NSData *data,
NSURLResponse *response,
NSError *error) {
//处理服务器返回的数据
NSLog(@"data:%@",[[NSString
alloc] initWithData:data
encoding:NSUTF8StringEncoding]);
}] resume];
}
相关文章推荐
- IOS 发送HTTP请求报错
- hdu5045 Contest(费用流)
- 使用Xutils无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase的类文件
- 网络图片查看
- 多益网络2016春季实习校招笔试回顾(C++游戏后台开发)
- 2016多益网络春季实习校园招聘笔试回顾(C++游戏后台开发)
- HTTP协议详解
- http://demo.netfoucs.com大量盗取CSDN博客文章,抹去作者版权信息
- 20159315《网络攻防实践》第八周总结
- 基于BP神经网络的PID控制
- Http Header里的Content-Type
- 【neutron】mitaka版本openstack网络之linux bridge
- 网络通信PDU和SDU的区别
- SpringMVC之HiddenHttpMethodFilter 过滤器
- QT基础(八)----TCP通信 & UDP通信
- 网络通信 --> Linux 五种IO模型
- 网络通信 --> 同步、异步、阻塞与非阻塞介绍
- 网络通信 --> Socket、TCP/IP、HTTP、FTP及网络编程
- HTTP协议
- HttpUtils实现断点下载APP并实现弹出安装窗口