• iOS 客户端与服务器的交互


     1.  客户端与服务器交互:

              是指客户端向服务器输入数据,服务器接收到数据后经过一系列的逻辑控制,返回结果到客户端。至于 客户端怎么连接到服务器,以何种方式,什么格式往服务器传输数据,以及服务器以什么格式返回数据到客户端以及怎么确保服务器返回的数据是客户端所需要的,就需要制定一个双方交互的标准文档,这个文档通常就是我们所说的接口文档。有了接口文档后,我们就可以解决上面说到的请求与返回中的问题。        

             一个正常的交互流程,通常包括请求跟响应两部分( 客户端发送请求到服务器-》 服务器接收到请求后返回数据到客户端)       

               (1): 请求

                   A: 请求方式

                         ios中请求服务器的方式有两种,一种是系统自带的,使用NSMutableURLRequest+ NSURLConnection的方式;另一种是使用第三方库,如早期的 ASIHttpRequest, 如今常用的AFNetworking。 而AFNetworking 是基于NSURLSession进行封装的。

                   B:  请求类型

                         主要有Get请求与Post  请求两种,两种请求方式各有优劣。

                   Get请求将参数直接写在访问路径上, 安全性不高, 而且地址最多 255 字节,但是操作简单;POST 请求, 将参数放到 body 里面,  需要将参数和地址分开, 安全性高相对较高。但是参数放在body里面, 不容易被捕获,操作相对复杂。

     

          (2): 响应

                      服务器接收到客户端的请求后,会响应请求并将数据返回给客户端,大多数返回的数据都是json格式。客户端拿到服务器返回的数据后,对数据进行解析后使用。

                      iOS中有系统自带的解析类:NSJSONSerialization。该类提供了将JSON数据转换为Foundation对象(一般都是NSDictionaryNSArray)和Foundation对象转换为JSON数据(可以通过调用isValidJSONObject来判断Foundation对象是否可以转换为JSON数据)的一系列方法。

                      json对象转换为Foundation数据: NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];

                      Foundation对象转换为json数据

       if ([NSJSONSerialization isValidJSONObject:dict]) {
             NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
              NSString *json = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
              NSLog(@"%@",json);
        }
    

    2.AFNetworking 是什么?

          AFNetworking是一个基于 NSURLSession 进行封装的网络开源库,适用于iOS以及Mac OS X. 主要有以下几个模块 

    (1).网络通信模块(AFURLSessionManager、AFHTTPSessionManger  后者继承于前者) 

    (2).网络状态监听模块(Reachability) 

    (3).网络通信安全策略模块(Security) 

    (4).网络通信信息序列化/反序列化模块(Serialization) 

    (5).对于iOS UIKit库的扩展(UIKit)

        

    3. 关于NSURLSession

          3.1. NSURLSession是什么:NSURLSession是苹果在iOS7后为HTTP数据传输提供的一系列接口 

          3.2. 基本构成部分: 

                (1)NSURLSession:    

                         1):NSURLSession的行为取决于三个方面。包括NSURLSession的类型、NSURLSessionTask的类型和在创建task时APP是否处于前端 

                         2)类型:  

                              A: defaultSession将cache和creditials储存于本地 

                              B: Ephemeral Session对数据更加保密安全,并不会向本地储存任何数据,将cache和creditials储存在内存中,并和Session绑定,当Session销毁时,对应的数据也会被销毁。 

                              C: backgroundSession可以时APP处于后台时继续数据传输,其行为与defaultSession类似,但是所有的数据传输均由一个非本APP的进程来管理。也有一些功能上的限制。 

                (2)NSURLSessionConfiguration 

                         1)作用:为NSURLSession配置一些请求所需要的策略。如:超时、缓存策略、链接。

                 3)NSURLSessionTask    

                      1)类型: NSURLSessionDataTask,NSURLSessionDownLoadTask,NSURLSessionUploadTask ;所有的Task状态都是暂停的,需要用[Task resume]启动Task

          3.3.作用: 加载数据,下载和上传 

          3.4. 实例化:a:使用 sharedSession,该类使用共享会话,该会话使用全局的Cache,Cookie和证书 

                           b:通过sessionWithConfiguration:方法创建对象 

                            c:通过sessionWithConfiguration:delegate:delegateQueue方法创建对象 

                            b,c两种方式可以创建一个新会话并定制其会话类型。该方式中指定了session的委托和委托所处的队列。当不再需要连接时,可以调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。

    4. 关于NSUrlConnection( iOS9宣布弃用)       

    作用: 

        1、负责发送请求,建立客户端和服务器的连接发送数据给服务器 

        2、并收集来自服务器的响应数据 

    步骤: 

        1、创建一个NSURL对象,设置请求路径 

        2、传入NSURL并创建一个NSURLRequest对象,设置请求头和请求体 

        3、使用NSURLConnection发送请求    sendSynchronousRequest/sendAsynchronousRequest 

        4、实现代理方法 

               //*当接收到服务器的响应(连通了服务器)时会调用

               -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;

             //当接收到服务器的数据时会调用(可能会被调用多次,每次只传递部分数据)  

              -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

             //当服务器的数据加载完毕时就会调用  

              -(void)connectionDidFinishLoading:(NSURLConnection *)connection

             //请求错误(失败)的时候调用(请求超时断网没有网,一般指客户端错误) 

             -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

    5. ios自带数据库(sqlite/coreData),为何还要使用务器读取数据

               因为iphone客户端的资源是非常有限的,我们更多的是把Iphone/ipad等作为一个终端和载体,虽然Iphone客户端也会有自己的数据库,但是也只是非常少量的客户端的数据库存储操作,对于大量复杂业务的处理和数据库的处理,大部分都是在服务端来完成的。

  • 相关阅读:
    C/C++常用的时间函数
    二维数组动态申请空间以及二维数组函数传参问题
    vc多线程编程
    [转载]_tmain main wmain WinMain
    using namespace std 解释
    [转载]C运行时库函数和API函数的区别和联系
    ZOJ 1013 Great Equipment(DP)
    c++ 运算符优先级表
    c语言输入的一些问题
    c\c++ 随机数函数
  • 原文地址:https://www.cnblogs.com/Cyan-zoey/p/8435964.html
Copyright © 2020-2023  润新知