- 一、一个HTTP请求的基本要素1.请求URL:客户端通过哪个路径找到服务器2.请求参数:客户端发送给服务器的数据 * 比如登录时需要发送的用户名和密码3.返回结果:服务器返回给客户端的数据 * 一般是JSON数据或者XML数据二、基本的HTTP请求的步骤(移动客户端)1.拼接"请求URL" + "?" + "请求参数" * 请求参数的格式:参数名 = 参数值 * 多个请求参数之间用 & 隔开:参数名1 = 参数值1 & 参数名2 = 参数值2 * 比如:http: //www.baidu.com?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) {
- 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.请求
- 1> 请求行 : 请求方法、请求路径、HTTP协议的版本
- GET /MJServer / resources / images / 1.jpg HTTP / 1.1 2 > 请求头: 客户端的一些描述信息 * User - Agent: 客户端的环境(软件环境)3 > 请求体: POST请求才有这个东西 * 请求参数,发给服务器的数据2.响应1 > 状态行(响应行): HTTP协议的版本、响应状态码、响应状态描述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.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://xxxxxx/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://xxxxxx/login?username=喝喝&pwd=123"];
- urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];十、数据安全1.网络数据加密1 > 加密对象:隐私数据,比如密码、银行信息2 > 加密方案 * 提交隐私数据,必须用POST请求 * 使用加密算法对隐私数据进行加密,比如MD5 3 > 加密增强:为了加大破解的难度 * 对明文进行2次MD5:MD5(MD5($pass)) * 先对明文撒盐,再进行MD5:MD5($pass.$salt) 2.本地存储加密1 > 加密对象:重要的数据,比如游戏数据3.代码安全问题1 > 现在已经有工具和技术能反编译出源代码:逆向工程 * 反编译出来的都是纯C语言的,可读性不高 * 最起码能知道源代码里面用的是哪些框架2 > 参考书籍:《iOS逆向工程》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];
来源: http://lib.csdn.net/snippet/ios/42595