项目中常见的客户端与服务端通信
可通信的内容(即访问服务器资源)
图片,文本,语音,视频,音乐
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的请求步骤是
- 创建NSURL
- 创建请求对象NSURLRequest
- 创建NSURLSession
- 根据NSURLSession创建NSURLSessionTask(有dataTaskWithURL和dataTaskWithRequest两种常见方法,GET方法可使用这两种方式,POST只能使用dataTaskWithRequest)
- 执行task
- 解析数据
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的