-
常见的协议
1:ftp://(文件传输协议)
2:http://(超文本传输协议)
3:https://(安全超文本传输协议)
4:file://(本地文件协议)
-
网络的七层模型(底层到高层)
1:物理层:用作机械,电子,定时接口通信信道上的原始比特流(二进制)传输
2:数据链路层:物理寻址,同时将原始比特流转变为逻辑传输线路
3:网络层:控制子网的运行,如逻辑编址,分组传输,路由选择
4:传输层:接收上层数据,在必要的时候,把数据进行分割,并将这些数据交给网络层,且保证这些数据能够有效到达对端
5:会话层:不同机器之间建立以及管理会话
6:表示层:信息到达语法,语义,以及他们的关联,如加密解密.翻译转换,压缩解压缩
7:应用层:各种程序应用协议.HTTP,FTP,SMTP,POP3
-
协议之HTTP
1:HTTP:超文本传输协议,属于应用层,有请求/响应构成(客户端向服务器发送一个请求报文,服务器以一个状态作为响应).是一个标准的客户端服务器模型
2:HTTP通常承载与TCP协议之上,有时候也承载于TLS或者SSL协议之上,这个时候就构成了我们所说的HTTPS协议 -
协议HTTPS
1:HTTPS(S_HTTP):增强版的HTTP,比HTTP更加安全,在HTTP基础上与安全套接字层(SSL)结合,把原始数据进行加密,然后接收方解密,加密和解密需要发送方和接收方交换公知的密钥来实现,所以,更加安全.
2:默认的端口号:HTTP(80),HTTPS(443)
3:注意:
①:HTTP协议,永远都是由客户端发送请求,服务器返回数据
②:HTTP协议是无状态的,同一个客户端的这次请求和上一次没有对应关系
③:HTTPS协议需要到CA(沃通,由受信任数字证书颁发机构,在验证服务器身份后,具有服务器身份验证和数据传输加密功能,因其需要配置在服务器上,所有也称SSL服务器,或者SSL证书)申请书,一般免费证书很少,需要交费
-
HTTP常见的请求方式
1:最基本的请求方式:GET,POST,PUT,DELETE,这四种请求方式对应着对资源的查改增删4种操作.
2:GET:一般用于获取或查询资源,也就是说如果请求URL是一个产生数据的过程,使用GET的话,需要的是产生的数据结果,而不是对产生过程的描述(如何产生数据的),普通上网浏览页面就是GET.
3:POST:一般用于更新数据,向服务器发送请求,告诉服务器接收请求后面的实体(BODY),也就是说,POST向服务器发送请求信息,而是需要提交的数据在信息后面的实体中.向指定的资源提交要被处理的数据.
说到GET,POST,那么他们的区别是什么呢?
- GET与POST方法有以下区别:
- 1.GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连eg:EditPosts.aspx?name=test1&id=123456.POST方法是把数据放在HTTP包的Body中.
- GET提交的数据大小有限(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值,也就是说Get是通过地址栏来传值,而Post是通过提交表单来传值.
- GET方式提交数据,会带来问题.比如一个登陆页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可从历史记录获得该用户的账号和密码.所以,如果这些数据是中文数据而且是非敏感数据,那么使用get;如果用户输入得到数据不是中文字符且是包含敏感数据,那么还是使用post为好.
实质上,GET和POST只是发送机制不同,并不是一个取一个发!
-
NSURLSession工作模式
1:默认会话模式:类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权
2:瞬时会话模式:该模式不会用磁盘保存任何数据,所有和会话相关的caches,证书,cookies都会被保存在ROM(内存),因此当程序是会话无效的时候,这些缓存,就会被自动清空.
3:后台会话模式:该模式在后台完成上传和下载,在创建配置对象时,需要一个NSString类型的ID,用于标识完成工作的后台会话
上面说了这么多,下面举例来看看.
首先使用http请求
要在Info.plist里边作一下修改
4FE5AF3B-9FA2-4D7C-82AB-FB0D4724C97D.png
#pragma mark----getSession(block方法)-------
- (void)getSession{
NSURL *url = [NSURL URLWithString:GET_URL];
//创建session对象
//NSURLSession 是基于任务完成相关的事件,所有内容都放在这个任务里
NSURLSession *session = [NSURLSession sharedSession];//使用系统提供的全局的NSURLSession 的一个单例
//创建task任务对象,NSURLSessionTask就是NSURLSession任务执行的对象
NSURLSessionTask *task = [session dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"getSession:%@",dic);
//回到主线程刷新表格
dispatch_async(dispatch_get_main_queue(), ^{
//刷新UI
//[self.tableView reloadData];
});
}
}];
//执行任务(一定要执行)
[task resume];
}
#pragma mark----postSession(block)-------
- (void)postSession{
//创建URL
NSURL *url = [NSURL URLWithString:POST_URL];
//创建请求(post请求必须初始化为可变请求)
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
//创建body
NSString *dataString = POST_BODY;
//转码
NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding];
[request setHTTPBody:data];
[request setHTTPMethod:@"POST"];
//创建session对象
NSURLSession *session = [NSURLSession sharedSession];
//创建任务
NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (!error) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"postsession :%@",dic);
//回到主线程刷新表格
dispatch_async(dispatch_get_main_queue(), ^{
//刷新UI
//[self.tableView reloadData];
});
}
}];
[task resume];
}
#pragma mark-----getSession 代理模式(postSession同理适用)----
- (void)requestData8{
//NSURLSession代理人的属性是只读的
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString:@"http://ipad-bjwb.bjd.com.cn/DigitalPublication/publish/Handler/APINewsList.ashx?date=20131129&startRecord=1&len=5&udid=1234567890&terminalType=Iphone&cid=213"];
//NSURLSessionTask的子类对象
NSURLSessionDataTask *task = [session dataTaskWithURL:url];
[task resume];
}
#pragma mark -------NSURLSessionDataDelegate协议方法(前提还要遵循NSURLSessionDataDelegate协议)-------
//服务器开始响应
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler{
//NSURLSession的代理协议里面必须设置允许继续请求,才会继续响应服务器
completionHandler(NSURLSessionResponseAllow);
self.resultData = [NSMutableData data];
}
//接收到数据
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data{
[self.resultData appendData:data];
}
//结束响应
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error{
if (error == nil) {
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.resultData options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"data=====%@",self.resultData);
NSLog(@"dic8=====%@",dic);
//回到主线程刷新表格
dispatch_async(dispatch_get_main_queue(), ^{
//刷新UI
//[self.tableView reloadData];
});
}
}
GET请求和POST请求方式的比较:
- 不同点:
- 1:给服务器传输数据的方式不同:
GET:通过网址字符串
POST:通过data - 2:传输数据的大小:
GET:网址字符串最多255字节.
POST:使用NSData,容量超过1G. - 安全性:
GET:所有传输给服务的数据,显示在网址里,类似于密码的明文输入,直接可见.
POST:数据被转成NSData(二进制数据),类似于密码的密文输入,无法直接读取.
除了上面的方法外GET异步和POST异步还有其他方法,只是不建议使用了.可做了解.
#pragma mark----异步GET-------
- (void)getYB{
//创建URL
NSURL *url = [NSURL URLWithString:GET_URL];
//创建请求
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//接收数据
#pragma mark---第一种方法block
// //方法1:block
// /*
// sendAsynchronousRequest:<#(nonnull NSURLRequest *)#> queue:<#(nonnull NSOperationQueue *)#> completionHandler:<#^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError)handler#>
// 参数1:请求对象
// 参数2:NSOperationQueue mainQueue,线程队列,让block在哪个线程中执行,主队列也叫串行队列
// 参数3:response:携带的接口信息.data:请求回来的数据.connectionError:错误信息
// */
// [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// //进行判断,判断错误信息是否为空
// if (!connectionError) {
// //进行解析
// NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
// NSLog(@"异步GET-------%@",dic);
// }
// }];
#pragma mark---第二种方法代理-----
[NSURLConnection connectionWithRequest:request delegate:self];
}
#pragma mark---NSURLConnectionDataDelegate代理方法----
//服务器开始响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
//初始化数据源
self.resultdata = [NSMutableData data];
}
//开始接收数据
//这个方法重复执行,将每次遇到的每段数据拼接到self.resultdata
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
NSLog(@"+++++++%@",self.resultdata);
NSLog(@"===========%@",data);
[self.resultdata appendData:data];
}
//结束服务器
- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
//进行解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:self.resultdata options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"GET异步代理:%@",dic);
}
下边也粗略说下同步连接,仅了解.因为同步连接,程序容易出现卡死现象.
#pragma mark----同步GET-------
- (void)getTB{
//创建URL(使用NSURL对象)
NSURL *url = [NSURL URLWithString:GET_URL];
//根据URL创建具体请求方式
/*
requestWithURL:<#(nonnull NSURL *)#> cachePolicy:<#(NSURLRequestCachePolicy)#> timeoutInterval:<#(NSTimeInterval)#>
参数1:接口
参数2:缓存策略
NSURLRequestUseProtocolCachePolicy(基础策略):默认缓存策略,如果缓存不存在,直接从服务器获取
NSURLRequestReloadIgnoringLocalCacheData:忽略本地缓存,直接从服务器获取
NSURLRequestReturnCacheDataElseLoad:优先加载缓存,如果没有就在原地址中加载
NSURLRequestReturnCacheDataDontLoad:使用本地缓存,如果没有,也不去服务器加载,导致请求失败,一般用于离线操作
参数3:设置一个延时时间,如果超过这个时间,那么请求终止(连接超时.单位:秒)
*/
NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30];
//接收网络数据(使用NSData对象)
/*
sendSynchronousRequest:<#(nonnull NSURLRequest *)#> returningResponse:<#(NSURLResponse *__autoreleasing _Nullable * _Nullable)#> error:<#(NSError * _Nullable __autoreleasing * _Nullable)#>
参数1:请求对象
参数2:存储一些网络请求信息,一般为nil,有包体的放包体
参数3:错误信息
*/
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// NSLog(@"---------------------------%@",data);
//JSON解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"GET同步:%@",dic);
}
#pragma mark----同步POST-------
- (void)postTB{
//创建URL
NSURL *url1 = [NSURL URLWithString:POST_URL];
//创建网络请求(post请求必须初始化为可变请求
NSMutableURLRequest *mutablerequest = [NSMutableURLRequest requestWithURL:url1];
//设置BODY
//创建字符串
NSString *dataString = POST_BODY;
//使用NSData类型接收转码后的BODY(UTF8)
NSData *postdata = [dataString dataUsingEncoding:NSUTF8StringEncoding];
//设置请求格式为post
[mutablerequest setHTTPMethod:@"POST"];
//设置请求体
[mutablerequest setHTTPBody:postdata];
//接收数据
NSData *data = [NSURLConnection sendSynchronousRequest:mutablerequest returningResponse:nil error:NULL];
//解析
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:(NSJSONReadingAllowFragments) error:nil];
NSLog(@"post同步---------%@",dic);
}
网友评论