网络请求

作者: 钎探穗 | 来源:发表于2016-07-04 21:04 被阅读668次
  • 常见的协议
    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);

    
}

相关文章

网友评论

    本文标题:网络请求

    本文链接:https://www.haomeiwen.com/subject/ihfhjttx.html