因为梦想会发光,所以,无论身处多么漆黑的角落,也总能有一束光,引领我们前往,风雨兼程,跋涉探险,在所不惜。
——苑子文,苑子豪《愿我的世界总有你二分之一》
简单介绍
一、一个HTTP请求的基本要素###
1.请求URL:客户端通过哪个路径找到服务器
2.请求参数:客户端发送给服务器的数据
- 比如登录时需要发送的用户名和密码
3.返回结果:服务器返回给客户端的数据
- 一般是JSON数据或者XML数据
二、基本的HTTP请求的步骤(移动客户端)
1.拼接"请求URL" + "?" + "请求参数"
- 请求参数的格式:参数名=参数值
- 多个请求参数之间用&隔开:参数名1=参数值1&参数名2=参数值2
- 比如:
http://117.185.16.153/naserver/common/gpstogeo?username=123&pwd=456
2.发送请求
3.解析服务器返回的数据
三、JSON解析###
1.利用NSJSONSerialization类解析
- JSON数据(NSData) --> Foundation-OC对象(NSDictionary、NSArray、NSString、NSNumber)
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;
2.JSON解析规律
* { } --> NSDictionary @{ }
* [ ] --> NSArray @[ ]
* " " --> NSString @" "
* 10 --> NSNumber @10
四、NSURLConnection###
1.发布异步请求01--block回调
+ (void)sendAsynchronousRequest:(NSURLRequest*) request
queue:(NSOperationQueue*) queue
completionHandler:(void (^)(NSURLResponse* response, NSData* data, NSError* connectionError)) handler
// request : 需要发送的请求
// queue : 一般用主队列,存放handler这个任务
// handler : 当请求完毕后,会自动调用这个block
2.利用NSURLConnection发送请求的基本步骤
1> 创建URL
NSURL *url = [NSURL URLWithString:@"http://4234324/5345345"];
2> 创建request
NSURLRequest *request = [NSURLRequest requestWithURL:url];
3> 发送请求
旧方法
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
^(NSURLResponse *response, NSData *data, NSError *connectionError) {
新方法
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
}
4> 处理服务器返回的数据
}];
五、XML
1.语法
1> 文档声明
<?xml version="1.0" encoding="UTF-8" ?>
2> 元素
3> 属性
<videos>
<video name="小黄人 第01部" length="10"/>
<video name="小黄人 第01部" length="10"/>
</videos>
// videos和video是元素(节点)
// name和length叫做元素的属性
//video元素是videos元素的子元素
2.解析
1> SAX解析:逐个元素往下解析,适合大文件
- NSXMLParser
2> DOM解析:一口气将整个XML文档加载进内存,适合小文件,使用最简单
- GDataXML
七、HTTP的请求方法
1.GET
1> 特点
- 所有请求参数都拼接在url后面
2> 缺点
- 在url中暴露了所有的请求数据,不太安全
- url的长度有限制,不能发送太多的参数
3> 使用场合
- 如果仅仅是向服务器索要数据,一般用GET请求
4> 如何发送一个GET请求
- 默认就是GET请求
// 1.URL
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
// 2.请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 3.发送请求
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
}];
2.POST
1> 特点
- 把所有请求参数放在请求体(HTTPBody)中
- 理论上讲,发给服务器的数据的大小是没有限制
2> 使用场合
- 除开向服务器索要数据以外的请求,都可以用POST请求
- 如果发给服务器的数据是一些隐私、敏感的数据,绝对要用POST请求
3> 如何发送一个POST请求
// 1.创建一个URL : 请求路径
NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/login"];
// 2.创建一个请求
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// 设置请求方法
request.HTTPMethod = @"POST";
// 设置请求体 : 请求参数
NSString *param = [NSString stringWithFormat:@"username=%@&pwd=%@", usernameText, pwdText];
// NSString --> NSData
request.HTTPBody = [param dataUsingEncoding:NSUTF8StringEncoding];
八、NSMutableURLRequest的常用方法
1.设置超时
request.timeoutInterval = 5;
// NSURLRequest是不能设置超时的,因为这个对象是不可变的
九、URL转码
1.URL中不能包含中文,得对中文进行转码(加上一堆的%)
NSString *urlStr = [NSString stringWithFormat:@"http://localhost/login?username=喝喝&pwd=123"];
urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// urlStr == @"http://localhost/login?username=%E5%96%9D%E5%96%9D&pwd=123"
十、数据安全
1.网络数据加密
1> 加密对象:隐私数据,比如密码、银行信息
2> 加密方案
- 提交隐私数据,必须用POST请求
- 使用加密算法对隐私数据进行加密,比如MD5
3> 加密增强:为了加大破解的难度 - 对明文进行2次MD5 : MD5(MD5($pass))
- 先对明文撒盐,再进行MD5 : MD5($pass.$salt)
2.本地存储加密
1> 加密对象:重要的数据,比如游戏数据
3.代码安全问题
1> 现在已经有工具和技术能反编译出源代码:逆向工程
- 反编译出来的都是纯C语言的,可读性不高
- 最起码能知道源代码里面用的是哪些框架
3> 解决方案:发布之前对代码进行混淆
- 混淆之前
@interface HMPerson :NSObject
- (void)run;
- (void)eat;
@end
- 混淆之后
@interface A :NSObject
- (void)a;
- (void)b;
@end
十一、监测网络状态
1.主动监测监测网络状态
// 是否WIFI
+ (BOOL)isEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);}
//是否3G
+ (BOOL)isEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}
#####2.监控网络状态
1> 监听通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];
2> 开始监听网络状态
// 获得Reachability对象
self.reachability = [Reachability reachabilityForInternetConnection];
// 开始监控网络
[self.reachability startNotifier];
3> 移除监听
[self.reachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];
* 注意:这里安全的含义仅仅是指是非修改信息。
POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存, (2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击