zoukankan      html  css  js  c++  java
  • 网络小结

    网络小结

    Posted on February 11th, 2014


    1. 网络访问的数据类型:
    * JSON
    特点:
         []
     表示数组
         {}
     表示字典 - 对象模型建立关系
    应用非常多,基本上移动开发的主要数据传输都是JSON

    要使用JSON,从网络上获取到数据之后使用:

         [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:
    nil];

    可以将网络数据反序列化为字典或者数组,具体转换类型,看JSON最外面的一个括号

    ===================================================================

    * XML
    特点:大,解析费劲
    提示:因为使用的少,可以不要求掌握,等碰到时再去翻看视频及PPT中的流程图

    要启动XML解析需要
    ===================================================================
    // 1) 实例化解析器
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    // 2) 设置代理
    parser.delegate =
     self;
    // 3)开始解析
    [parser parse];
    ===================================================================
         XML
    解析的六个代理方法
    说明:
    // 1. 开始解析文档,在这里做初始化工作

    1. 解析准备工作

    2.3.4 三个步骤会循环执行,一直到所有的节点解析完成

    2步解析一个节点,即节点中的字典
    3步负责拼接字符串
    4步节点解析完成,可以用KVC直接设置对象内容

    5. 用于收尾工作
    6. 解析出错,需要把中间数据清除,以免造成不必要的错误

    推荐技巧,可以将所有的属性设置到一个节点中的属性节点中,如此只需要第二步即可。

    格式如下:
    "12" index="1"]] ]]> 
    <item< span="">id="1558" title="错入豪门" tag="都市言情"source="/upload/file/2013_07_4/2013718101155179.zip"author="唯一的迷蝶" updatetime="2013-6-21 11:06:17"summary="新婚之夜、她..." clicks="86945" words=""logo="/upload/pic/2013_06_5/20136211172503.png"jx="False" />



    - (
    void)parserDidStartDocument:(NSXMLParser *)parser
    // 2. 解析一个节点
    - (
    void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    // 3. 查找节点内容,可能会多次
    - (
    void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    // 4. 节点完成
    - (
    void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    // 5. 解析完成,做收尾工作
    - (
    void)parserDidEndDocument:(NSXMLParser *)parser
    // 6. 解析出错,清理中间数据
    - (
    void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError


    ===================================================================
    * HTML
    通常用于自己没有服务器,或者某些网络资源确实非常重要!可以实现抓取以备不时之需。

    例如:省、市、地区、邮政编码、身份证的前6位归属

    要使用HTML可以利用正则表达式进行解析,具体使用可以参见今天示例程序中NSString+Regex.h

    提示:以后使用可以直接在分类代码基础上使用,自行编写匹配方案即可。

    要使用正则表达式步骤

    1> 指定匹配方案
    *
     打开网页源代码,找到需要抓取的部位
    *
     将前后标记一起复制到代码中,然后用(.*?)替代我们需要抓到的内容即可
    *
     匹配方案必须要能够和页面内容唯一匹配

    2> 实例化正则表达式,需要指定两个选项
    NSRegularExpressionCaseInsensitive      
    忽略大小写
    NSRegularExpressionDotMatchesLineSeparators
     .能够匹配换行

    3]] ]]> 
    *
     使用firstMatchInString查找第一个与匹配方案相同的内容
    *
     使用matchesInString可以查找多个与匹配方案相同的内容,

    通常用在
    html里面标示无符号的序列
    html里面标示数字的序列

    4> 根据resultrangeAtIndex方法,获取到要抓取的内容
    第一个括号对应的索引是1,第二个是2,依次类推

    5> 根据range,使用字符串的substringWithRange方法,可以获得准确的内容

    在正则表达式中,需要做出错处理,因为如果方案书写不正确,regex是不能被实例化的

    ===================================================================

    网络访问中的方法:

    1]] ]]> GET
    // 1. 定义URL,确定要访问的地址
    NSURL *url = [NSURL URLWithString:urlString];
    // 2. 定义URLRequest,确定网络访问请求,在GET方法中直接用URL即可
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:
    2.0f];

    ===================================================
    NSURLResponse *response =
     nil;
    NSError *error =
     nil;
    // 同步请求的应用场景:例如:网银账户的登录!
    // 一定要获取到某个网络返回数据后,才能进行下一步操作的场景!
    // 发送同步请求,respone&error要带地址的原因就是为了方法执行后,能够方便使用response&error
    NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    ===================================================

    // 异步方法
    [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
    // 块代码的内容会在网络访问后执行
    // 块代码是预先定义好的代码片段,在满足某个条件时执行的。
         NSLog(
    @"%@", [NSThread currentThread]);
    }];
    ===================================================

    2]] ]]> POST
    // 1. 定义URL,确定要访问的地址
    NSURL *url = [NSURL URLWithString:urlString];
    // 2. 定义请求,生成数据体添加到请求
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    // 1) 指定网络请求的方法
    request.HTTPMethod =
     @"POST";

    // 2) 生成数据体
    // * 先生成字符串
    NSString *bodyStr = [NSString stringWithFormat:
    @"username=%@&password=%@", userName, password];
    // * 将字符串转换成NSData
    request.HTTPBody = [bodyStr dataUsingEncoding:NSUTF8StringEncoding];

    // 提示:POST请求多用于用户登录,或者上传文件,在实际开发中,“POST请求的参数及地址需要与公司的后端程序员沟通。
    // POST同样具备同步和异步方法

    ===================================================================
    * AFNetworking      AFN
    第三方网络框架

    // 应用场景,针对""的文件下载以及文件上传
    // 目前还有非常多公司在使用此框架!


    AFN
    使用步骤

    1. 定义成员变量,记录AFN的客户端,使用BaseURL初始化
    该客户端会同时实例化一个操作队列,以便于后续的多线程处理

         AFHTTPClient *_httpClient;

    2. 定义AFHTTPRequestOperation,并且定义其中的操作即可
         AFHTTPRequestOperation
    是对NSURLConnection的封装

    提供有三个块代码:
    1> 完成操作的块代码

    - (
    void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, idresponseObject))success
    failure:(
    void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

    2> 下载进度的块代码
    - (
    void)setDownloadProgressBlock:(void (^)(NSUInteger bytesRead, long long totalBytesRead, long longtotalBytesExpectedToRead))block;

    3> 上传进度块代码
    - (
    void)setUploadProgressBlock:(void (^)(NSUInteger bytesWritten, long long totalBytesWritten, long longtotalBytesExpectedToWrite))block;


    基本使用的核心代码
    // 1. 实例化AFHTTPClient
    NSURL *url = [NSURL URLWithString:
    @"http://192.168.3.251/~apple/itcast"];
    _httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];

    // 2. 定义网络请求操作
    // 1> NSURLRequest
    NSURLRequest *request = [_httpClient requestWithMethod:
    @"GET" path:@"download/Objective-C2.0.zip" parameters:nil];

    // 2> AFHTTPRequestOperation => NSURLConnection
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];

    // 3> 设置完成块代码,相比较OC的区别就在这里
    setCompletionBlockWithSuccess
    å
    // 4> 启动操作
    [_httpClient.operationQueue addOperation:op];
    */

    在网络应用开发中,真正涉及到网络操作的代码,非常少!最主要的把
         GET
    方法
    同步、异步
    反序列化JSON
    OK


    作者:
    出处:http://www.cnblogs.com/ChenYilong/(点击RSS订阅)
    本文版权归作者和博客园共有,欢迎转载,
    但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    LootCode-链表排序-Java
    Vue创建项目及基本语法 一
    七大设计原则、单一职责原则
    SpringBoot 将自制的Starter 发布到远程公服
    SpringBoot 系列
    Mysql Sql 语句练习题 (50道)
    一、SpringBoot学习笔记_Eclipse 安装 SpringBoot、配置Gradle
    七、垃圾回收_判断对象是否存活算法_可达性分析法详解
    从零开始搭建Django+vue前后端分离项目
    Airtest一:批量运行脚本、汇总报告、导出报告
  • 原文地址:https://www.cnblogs.com/ChenYilong/p/3556241.html
Copyright © 2011-2022 走看看