您的位置:首页 > 理论基础 > 计算机网络

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];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: