博客> 网络总结
网络总结
2017-10-18 11:34 评论:0 阅读:286 vistatinchao
ios 文件 网络 上传 转码

一、一个HTTP请求的基本要素 1.请求URL:客户端通过哪个路径找到服务器

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

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

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

  • 一般是JSON数据或者XML数据

二、基本的HTTP请求的步骤(移动客户端) 1.拼接"请求URL" + "?" + "请求参数"

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> 属性

<video name="小黄人 第01部" length="10"/> <video name="小黄人 第01部" length="10"/>
  • 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://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=喝喝&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> 解决方案:发布之前对代码进行混淆

  • 混淆之前 @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];

收藏
0
sina weixin mail 回到顶部