iOS网络篇-网络基础

项目中常见的客户端与服务端通信

可通信的内容(即访问服务器资源)

图片,文本,语音,视频,音乐

URL:决定了和谁通信
http://www.baidu.com:8888/list?name=123&age=18
协议:http://
主机名及端口号:www.baidu.com:8888
接口名称(路径): list
接口字段(查询条件):name=123
?为接口名称和接口字段的分割
&为参数的分割
HTTP: 超文本传输协议(HyperText Transfer Protocol)

用来实现客户端和服务器之间进行信息通信的协议,它提供了通信的标准和规范

常见的通信请求方法

1.GET:从服务器获取一段内容,不包含请求体
2.POST:使用客户端提供的数据更新实体
3.HEAD:获取响应的元数据而无需检索响应的全部内容
4.PUT:使用客户端提供的数据添加实体
5.DELETE:使用客户端提供吧的请求体来删除实体

iOS中的网络请求是如何进行的?

NSURL:用来标识客户端访问哪台服务器上的指定资源
NSURLRequest:用来标识客户端发起的网络请求内容
NSURLSession:用来表示客户端和服务器端建立起来的网络连接
NSURLResponse:表示服务端的响应结果

总结一下iOS的请求步骤是
  1. 创建NSURL
  2. 创建请求对象NSURLRequest
  3. 创建NSURLSession
  4. 根据NSURLSession创建NSURLSessionTask(有dataTaskWithURL和dataTaskWithRequest两种常见方法,GET方法可使用这两种方式,POST只能使用dataTaskWithRequest)
  5. 执行task
  6. 解析数据

Get请求

//表示访问的服务器地址
NSURL *url = [NSURL URLWithString:@"http://XXXXXXXX/传参"];
//表示客户端发起网络请求的请求内容, NSURLRequest默认的请求方式是Get
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//创建网络连接对象
NSURLSession *session = [NSURLSession sharedSession];
/*参数1:请求对象
参数2:completionHandler回调中
data为服务器返回的数据
response为响应头信息,是对服务端的描述
error为错误信息 **/
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        解析数据
    }];
//启动网络连接
[dataTask resume];

POST请求

1.不需要将参数拼接到URL中,需要设置到request中,格式不变
2.需要设置NSMutableURLRequest请求,因为他可以更改
3.更改request.httpMethod为POST
4.将GET中的拼接的参数拿出来,格式一样,将参数转换成NSData,然后设置为request.HTTPBody
5.其他和GET一样

NSURL *url = [NSURL URLWithString:@"http://XXXXXXXX"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"POST";
request.HTTPBody = [@"username=520it&pwd=520it&type=JSON" dataUsingEncoding:NSUTF8StringEncoding];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        解析数据
    }];
[dataTask resume];
Get和Post的区别

1.Get从服务器获取数据,Post向服务器发送数据
2.Get将参数拼接到URL后面,Post将请求参数放到Body里面
3.Get传送数据量小,Post传送数据量不受限制
4.Get安全性低,Post安全性高

因为苹果之前爆出了多起安全事件的影响,在iOS9中新增ATS(App Transport Security)特性,强制使用HTTPS进行网络请求,可以提升安全级别,但之前项目中仍会有HTTP请求,为了方便版本迭代,所以提供了键值属性,在info.plist文件中设置这个属性后,我们就可以使用HTTP请求

NSAppTransportSecurity
NSAllowsArbitraryLoads

解析网络返回数据

在代理中返回,数据并不是一次性返回的,是一段一段返回的,didReceiveData方法会调用多次,所以我们声明变量,在didReceiveData中做拼接,等到全部都返回,再调用didCompleteWithError方法.
解析是用的自带的NSJSONSerialization方法去解析

//表示访问的服务器地址
NSURL *url = [NSURL URLWithString:@"http://XXXXXXXX/传参"];
//表示客户端发起网络请求的请求内容, NSURLRequest默认的请求方式是Get
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request];
[dataTask resume];

//下面是代理
<NSURLSessionDataDelegate>
@property (nonatomic, strong) NSMutableData *responseData;
//1.接收到服务器响应的时候调用该方法
//[NSOperationQueue mainQueue]   主队列:   代理方法在主线程中调用
//[[NSOperationQueue alloc]init] 非主队列: 代理方法在子线程中调用
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
    //在该方法中可以得到响应头信息,即response
    //需要使用completionHandler回调告诉系统应该如何处理服务器返回的数据,默认是取消的
    /*
     NSURLSessionResponseCancel = 0,        默认的处理方式,取消
     NSURLSessionResponseAllow = 1,         接收服务器返回的数据
     NSURLSessionResponseBecomeDownload = 2,变成一个下载请求
     NSURLSessionResponseBecomeStream        变成一个流
     */
    completionHandler(NSURLSessionResponseAllow);
}

//2.接收到服务器返回数据的时候会调用该方法,如果数据较大那么该方法可能会调用多次
-(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
    //拼接服务器返回的数据
    if(_responseData = nil){
        _responseData = [[NSMutableData alloc] init];
     }
    [self.responseData appendData:data];
}

//3.当请求完成(成功|失败)的时候会调用该方法,如果请求失败,则error有值
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
    if(error == nil){
        //解析数据
       id obj= [NSJSONSerialization JSONObjectWithData:self.responseData options:kNilOptions error:nil];
        NSLog(@"%@",obj);
    }
}
常见的网络响应状态码

200: 正常
400: 错误请求
401: 未授权
404: 未找到
500: 内部服务器错误

HTTP和TCP的区别

1.HTTP建立在TCP的基础之上
2.TCP是长连接,HTTP是短连接,因为HTTP是每次TCP长连接后立即断开

传输层协议(TCP / UDP)

定义:告诉你传输数据的规则是怎么样的
socket是执行规则的实体,你按照TCP建立socket,socket就按照TCP的规则运转,也就是建立连接,运送包裹,确认包裹收到,运送下一个包裹,再次确认,断开连接.UDP建立的Socket就是建立连接,运包裹(不确认),运包裹(不确认),断开连接

应用层协议(HTTP网页,接口 / FTP文件下载 / SMTP电子邮件)

定义:你的实际用途是什么,他们就会在传输协议上做一层封装,传输数据用的也是TCP或UDP
http协议:相当于让你按照URL的方式进行网络传输,但是底层机制,也是将URL拆分,然后用TCP/IP协议建立传输请求socket,通讯完成后再断开

备注

TCP/IP协议(socket)
先跟服务器建立连接——开线程等待服务器连接通过——接收服务器连接成功的通知——发送消息
发送请求1——隔段时间继续发送情求1(可无)——对方收到后,给回执——收到回执,继续发送请求1
长连接: 建立连接——发消息1——发送消息2——发送消息3...发送完成,连接断开
常用于定位,导航,IM(即时通讯)
UDP协议
发送请求1——发送请求2——发送请求3
效率比较快,但不管对方有没有收到
HTTP协议
给个URL,传递参数即可
短连接:发消息1——建立连接——发送完成,连接断开
发消息2——建立连接——发送完成,连接断开
...
FTP协议
文件传输协议,用于下载文件

打个比方就是搬家,我们有一个包裹从5楼搬到车里,半小时以后还有一个包裹也要搬到车里,那么我需要开车门,把包裹放进去,关车门
如果我们一口气要有20个包裹从5楼搬到车里,不考虑安全因素,我们肯定更希望是,开车门,运包裹1,包裹2,...包裹20,最后关车门
socket你就可以是想象成车钥匙,他的作用是帮你打开车门,关闭车门,其实还包含运送包裹

网上下载高清电影的协议是ftp

formal配置的邮箱是smtp的


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容