• iOS:网络编程中三个数据解析协议HTTP、XML、JSON的详细介绍


    网络编程:HTTP协议、XML数据协议、JSON数据协议:

    HTTP:
    1、HTTP传输数据有四种方式:Get方式、Post方式、同步请求方式、异步请求方式。
    说明:同步和异步请求方式在创建链接对象和创建请求对象时,用Get方式或Post方式中的任意一种即可;那么,同步/异步请求方式和Get/Post方式不同的地方是什么呢?区别在于进行连接处理这一步上,Get/Post方式它们均使用相同代理NSURLConnectionDataDelegate的方法传输数据,而同步/异步请求方式则不需要使用代理。
     
     
    2、实现步骤:
    •第一步:确定地址——URL   •NSURL(地址)
    •第二步:建立请求    •NSURLRequest(请求,GET请求使用)/•NSMutableURLRequest(可变请求,POST请求使用)
    •第三步:开始连接    •NSURLConnection(连接)

       等待网络处理中……

    •第四步:连接完成,处理结果
     
     
    3、<NSURLConnectionDataDelegate>方法,Get和Post方式发送数据时,连接过程中使用代理,之所以使用代理,是因为要处理请求返回的结果!

    // 服务器开始返回数据

    -(void)connection:didReceiveResponse:

    // 收到服务器返回的数据,本方法会被调用多次

    - (void)connection:didReceiveData:

    // 数据接收完毕,做数据的最后处理

    -(void)connectionDidFinishLoading:

    // 网络连接错误

    - (void)connection:didFailWithError:

    // 发送数据给服务器,POST 请求使用此方法

    - (void)connection:didSendBodyData:totalBytesWritten: totalBytesExpectedToWrite:

    unsigned long enconding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000)

     

    4、GET请求步骤——1. 地址 2.请求 3.连接 4.启动

    (1)定义URL:

    •NSString *urlStr = @"http://127.0.0.1/login.php?username=admin&password=123";
    •NSURL *url = [NSURL URLWithString:[urlStr   
           stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
     
    (2)定义Reauest:
    •NSURLRequest *request = [NSURLRequest requestWithURL:url];
     
    (3)定义Connection:
    •NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
     
    (4)启动Connection:
    •[conn start];
     
     
    5、POST请求步骤——1. 地址 2.请求 3.连接 4.启动
    (1)定义URL
    •NSString *urlStr = @"http://xxx.com/login.php”;
     
    (2)定义Request:
    •NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    •// 等待服务器响应的最长时间
    •[request setTimeoutInterval:5.0];
    •// 设置请求方法,大小写无关
    •[request setHTTPMethod:@"post"];
    •NSString *bodyString = [NSString stringWithFormat:@"username=%@&password=%@",_userNameText.text,_passwordText.text];
    •// 生成请求体数据并编码
    •NSData *body = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
    •// 设置HTTP请求数据体
    •[request setHTTPBody:body];
     
    (3)定义Connection:
    •NSURLConnection *conn = [[NSURLConnection alloc]initWithRequest:request delegate:self];
     
    (4)启动Connection:
    •[conn start];
     
     
    6、同步请求和异步请求(前两步和Get或Post相同): 1. 地址 2.请求 3.使用同步/异步请求
    •NSURLConnection提供了两个静态方法可以直接同步或异步调用NSURLRequest,而无需通过NSURLConnectionDataDelegate获取数据
    •同步请求:

    sendSynchronousRequest:request returningResponse:&response error:&error

    •异步请求:

    sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)

    •服务器传输回来的数据,设置要用的编码类型,将汉字GBK编码转为国际通用编码UTF-8编码:

    unsigned long encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);

     

     ※知识拓展:

    从 GBK 转到 UTF-8   (上面的例子可作为一个成功案例)
    用 NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000) ,然后就可以用initWithData:encoding来实现。
    从 UTF-8 转到 GBK
    CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000),得到的enc却是kCFStringEncodingInvalidId。
    没关系,试试 NSData *data=[nsstring dataUsingEncoding:-2147482063];
    
注意:必须使用kCFStringEncodingGB_18030_2000这个字符集,那个kCFStringEncodingGB_2312_80试了也不行。
    成功案例: 将uif-8格式(xcode默认的)的字符串str_selectedLeiXing 转换为GBK格式的strGBK,如下所示:

        NSData *data = [str_selectedLeiXing dataUsingEncoding:-2147482063];

        NSString *strGBK = [[NSString alloc]initWithData:data encoding:-2147482063];

        以上代码的实现,不需要添加任何附加开发包。

    XML:

    1、介绍:

    可扩展标记语言 

     用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言

    易读性高,编码手写难度小,数据量大
     
    2、两种解析方式:
    (1)NSXMLParser是SAX方法解析
    SAX(Simple API for XML)
    只能读,不能修改,只能顺序访问,适合解析大型XML,解析速度快
    常应用于处理大量数据的XML,实现异构系统的数据访问,实现跨平台
    从文档的开始通过每一节点移动,定位一个特定的节点
     
    (2)DOM(Document Object Model)
    不仅能读,还能修改,而且能够实现随机访问,缺点是解析速度慢,适合解析小型文档
    一般应用与小型的配置XML,方便操作
    为载入到内存的文档节点建立类型描述,呈现可横向移动、潜在巨大的树型结构
    在内存中生成节点树操作代价昂贵
     
    3、NSXMLParser解析过程:
    <1>. 创建NSXMLParser实例,并传入从服务器接收的XML数据
    <2>. 定义解析器代理
    <3>. 解析器解析
    <4.. 通过解析代理方法完成XML数据的解析
     

    4、NSXMLParser解析的NSXMLParserDelegate协议代理方法:

    // 1. 开始解析某个元素,会遍历整个XML,识别元素节点名称

    - (void)parser:didStartElement:namespaceURI:qualifiedName:attributes:

    // 2. 文本节点,得到文本节点里存储的信息数据,对于大数据可能会接收多次!为了节约内存开销

    - (void)parser:foundCharacters:

    // 3. 结束某个节点,存储从parser:foundCharacters:方法中获取到的信息

    - (void)parser:didEndElement:namespaceURI:qualifiedName:

    注意:在解析过程中,上述三个方法会不停的重复执行,直到遍历完成为止

    // 4. 开始解析XML文档

    - (void)parserDidStartDocument:

    // 5. 解析XML文档结束

    - (void)parserDidEndDocument:

    // 6. 解析出错

    - (void)parser:parseErrorOccurred:

     

     
     

    JSON:

    1、介绍:

    作为一种轻量级的数据交换格式,正在逐步取代XML,成为网络数据的通用格式

    基于JavaScript的一个子集
    易读性略差,编码手写难度大,数据量小
    JSON格式取代了XML给网络传输带来了很大的便利,但是却没有了XML的一目了然,尤其是JSON数据很长的时候,我们会陷入繁琐复杂的数据节点查找中
     
    2、解析方式:
     
    作为一种轻量级的数据交换格式,JSON正在逐步取代XML,成为网络数据的通用格式
    从iOS 5开始,使用NSJSONSerialization对JSON解析
     
    其他常见的三种JSON解析第三方库:
    SBJson
    JSONKit
    TouchJson
    从性能上来说,NSJSONSerialization最好,JSONKit其次。SBJson使用较为广泛,API简单易用
    使用类方法JSONObjectWithData:options:error:可以将接收到的JSON数据反序列化为NSArray或NSDictionary等对象
     
    3、步骤:
      <1>加载JSON数据

    - (IBAction)loadJSONData:(id)sender

    {

        // 定义URL

          NSString *urlStr = [NSString stringWithFormat:@"%@/itcast/videos.php?format=json", WEB_ROOT_URL];

        NSURL *url = [NSURL URLWithString:urlStr];

        

        // 获取网络数据

          NSData *data = [NSData dataWithContentsOfURL:url];

        

        // 反序列化JSON数据,生成NSArray

        NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];

        // 将JSON字典写入文件,便于调试

          NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *docDir = [docs[0]stringByAppendingPathComponent:@"jsonArray.plist"];

        [array writeToFile:docDir atomically:YES];

    }

      <2>存储加载到的数据
     

    // 初始化数据数组

    if (_dataList == nil) {

        _dataList = [NSMutableArray array];

    } else {

        [_dataList removeAllObjects];

    }

    // 填充数组

    for (NSDictionary *dict in array) {

        Video *video = [[Video alloc]init];

        

        [video setId:[dict[@"id"]integerValue]];

        [video setName:dict[@"name"]];

        [video setLength:[dict[@"length"]integerValue]];

        [video setVideoURL:[NSString stringWithFormat:@"%@%@", WEB_ROOT_URL, dict[@"videoURL"]]];

        [video setImageURL:[NSString stringWithFormat:@"%@%@", WEB_ROOT_URL, dict[@"imageURL"]]];

        [video setDescription:dict[@"description"]];

        [video setTeacher:dict[@"teacher"]];

        

        [_dataList addObject:video];

    }

    // 刷新表格

    [_videosTable reloadData];

  • 相关阅读:
    逆变和协变
    委托的泛型版本
    委托的协变和逆变
    IIS8应用池重启脚本
    JS获取url参数及url编码、解码
    Jmeter压测Thrift服务接口
    浏览器插件及好用的小工具
    Jmeter入门实例
    BugBash活动分享
    如何作缺陷分析
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4833439.html
Copyright © 2020-2023  润新知