网络

网络

一个HTTP请求的基本要素

1.请求URL:客户端通过哪个路径找到服务器

2.请求参数:客户端发送给服务器的数据

比如登录时需要发送的用户名和密码

3.返回结果:服务器返回给客户端的数据

一般是JSON数据或者XML数据

基本的HTTP请求的步骤(移动客户端)

1.拼接”请求URL” + “?” + “请求参数”

请求参数的格式:参数名=参数值
多个请求参数之间用&隔开:参数名1=参数值1&参数名2=参数值2
比如:http://localhost:8080/MJServer/login?username=123&pwd=456

2.发送请求

3.解析服务器返回的数据

JSON解析

1.利用NSJSONSerialization类解析

JSON数据(NSData) –> Foundation-OC对象(NSDictionary、NSArray、NSString、NSNumber)

1
+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error;

2.JSON解析规律

{ } –> NSDictionary @{ }
[ ] –> NSArray @[ ]
“ “ –> NSString @” “
10 –> NSNumber @10

NSURLConnection

1.发布异步请求01–block回调

1
2
3
+ (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

1
NSURL *url = [NSURL URLWithString:@"http://4234324/5345345"];

2.创建request

1
NSURLRequest *request = [NSURLRequest requestWithURL:url];

3.发送请求

1
2
3
4
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 处理服务器返回的数据
}];

XML

1.语法

1)文档声明

1
<?xml version="1.0" encoding="UTF-8" ?>

2)元素
3)属性

1
2
3
4
<videos>
<video name="小黄人 第01部" length="10"/>
<video name="小黄人 第01部" length="10"/>
</videos>

videos和video是元素(节点)
name和length叫做元素的属性
video元素是videos元素的子元素

2.解析

1) SAX解析:逐个元素往下解析,适合大文件

NSXMLParser

DOM解析:一口气将整个XML文档加载进内存,适合小文件,使用最简单

GDataXML

HTTP的通信过程

1.请求

1)请求行 : 请求方法、请求路径、HTTP协议的版本

1
GET /MJServer/resources/images/1.jpg HTTP/1.1

2)请求头 : 客户端的一些描述信息

User-Agent : 客户端的环境(软件环境)

3)请求体 : POST请求才有这个东西

请求参数,发给服务器的数据

2.响应

1)状态行(响应行): HTTP协议的版本、响应状态码、响应状态描述

1
HTTP/1.1 200 OK

2).响应头:服务器的一些描述信息

Content-Type : 服务器返回给客户端的内容类型
Content-Length : 服务器返回给客户端的内容的长度(比如文件的大小)

3).实体内容(响应体)

服务器返回给客户端具体的数据,比如文件数据

HTTP的请求方法

1.GET

1)特点

所有请求参数都拼接在url后面

2)缺点

在url中暴露了所有的请求数据,不太安全
url的长度有限制,不能发送太多的参数

3)使用场合

如果仅仅是向服务器索要数据,一般用GET请求

4)如何发送一个GET请求

默认就是GET请求

1
2
3
4
5
6
7
// 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
2
3
4
5
6
7
8
9
10
// 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转码

URL中不能包含中文,得对中文进行转码(加上一堆的%)

1
2
3
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语言的,可读性不高
最起码能知道源代码里面用的是哪些框架

2)参考书籍:《iOS逆向工程》
3)解决方案:发布之前对代码进行混淆

混淆之前

1
2
3
4
@interface HMPerson :NSObject
- (void)run;
- (void)eat;
@end

混淆之后

1
2
3
4
@interface A :NSObject
- (void)a;
- (void)b;
@end

监测网络状态

1.主动监测监测网络状态

1
2
3
4
5
6
7
8
// 是否WIFI
+ (BOOL)isEnableWIFI {
return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable);
}
// 是否4G
+ (BOOL)isEnable3G {
return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable);
}

2.监控网络状态

1)监听通知

1
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(networkStateChange) name:kReachabilityChangedNotification object:nil];

2)开始监听网络状态

1
2
3
4
// 获得Reachability对象
self.reachability = [Reachability reachabilityForInternetConnection];
// 开始监控网络
[self.reachability startNotifier];

3)移除监听

1
2
[self.reachability stopNotifier];
[[NSNotificationCenter defaultCenter] removeObserver:self];