iOS 网络编程

前言

最近要给quanta的小朋友讲iOS网络编程的相关知识,所以提前在这里梳理。

何为HTTP

首先我们必须了解HTTP协议,何为HTTP?超文本传送协议,它是基于应用层的通信规范,是一个设计来使客户端和服务器顺利进行通讯的协议。 HTTP做了以下几方面的规定:
1. request和response的格式;
2. 建立连接的方法,有持久连接和非持久连接。HTTP1.1默认是带流水的持久连接;
非持久连接:服务器发出一个对象后,相应TCP连接关闭,每个TCP连接只用于传输一个请求消息和一个响应消息;
持久连接:单个持久TCP连接,它分为不带流水线和流水线。不带流水线的只有收到上个请求响应再请求; 3. 缓存机制(减少发送请求);
4. 响应授权激发机制,用于服务器激发客户端请求并授权;

过程:客户端先建立一个TCP连接,再发送一个请求,服务器收到请求处理后响应,传送数据,客户端可以继续发生请求或关闭TCP

GET与POST

GET与POST是两种请求方式,GET主要用于从指定的服务器中获取数据,POST主要用于提交数据给指定服务器 区别:
GET请求能够被缓存,POST请求不能被缓存下来 GET提交的数据放在url(以?分割url和传输数据,参数之间以&相连)
GET请求会保存在浏览器的浏览记录中,POST请求不会保存在浏览器浏览记录中
以GET请求的URL能够保存为浏览器书签,以POST请求的URL无法保存为浏览器书签
GET请求有长度限制,POST请求无长度限制 GET安全性没有POST好,因为GET提交的参数是可见

iOS网络编程

在iOS9之前,我们主要利用NSURLConnection来进行网络请求操作,在iOS9以后,苹果推荐使用NSURLSession。具体如何使用这些类来进行网络请求,我以代码加注释的形式呈现出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
/**
 * 可变请求与不可变请求的区别:
 * 1、不可变请求在初始化的时候需要指定url,而可变请求可以以后指定
 * 2、cachePolicy缓存策略 timeoutInterval超时时间
 **/

NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://a1.jikexueyuan.com/home/201601/25/1f7e/56a5887620a10.png"] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];



/**
 * iOS 9以前 请求,默认是GET
 **/
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
    //解析json数据
    NSDictionary* dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"%@",dict);
   dispatch_async(dispatch_get_main_queue(), ^{
       _imageView.image = [UIImage imageWithData:data];
   });
}];


/**
 * iOS 9 请求
**/
NSMutableURLRequest* request2 = [[NSMutableURLRequest alloc]init];
request2.URL = [NSURL URLWithString:@"http://a1.jikexueyuan.com/home/201601/25/1f7e/56a5887620a10.png"];
request2.HTTPMethod = @"GET";

NSURLSession* session = [NSURLSession sharedSession];

[[session dataTaskWithRequest:request2 completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%@",data);
        _imageView.image = [UIImage imageWithData:data];
    });
}] resume];
//记得resume 唤醒 suspend 暂停

/**
 * 上传 用POST,具体可以看这个链接 http://borissun.iteye.com/blog/1338991
 **/
NSMutableURLRequest* postRequest = [[NSMutableURLRequest alloc]init];
postRequest.URL = [NSURL URLWithString:@""];
NSInputStream* inStream = [NSInputStream inputStreamWithFileAtPath:@""];
postRequest.HTTPBodyStream = inStream;
postRequest.HTTPMethod = @"POST";

Comments