美文网首页
iOS程序访问服务器-实战篇二

iOS程序访问服务器-实战篇二

作者: 风紧扯呼丶 | 来源:发表于2019-12-08 15:03 被阅读0次

本篇模拟对服务器返回xml数据以及json数据进行解析操作,获取指定值

  1. 运行apache
    sudo apachectl -k start
  2. xml文件
    http://localhost/xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<node>
  <student stuId="1">
    <name>张鹏</name>
    <email>1234567890@qq.com</email>
    <username>一样菜</username>
    <code>985931</code>
  </student>
  <student stuId="2">
    <name>王ss黑</name>
    <email>2345678901@qq.com</email>
    <username>冰封</username>
    <code>5625362</code>
  </student>
  <student stuId="3">
    <name>阿顿</name>
    <email>23478901@qq.com</email>
    <username>封</username>
    <code>5625362</code>
  </student>
  <student stuId="4">
    <name>王二</name>
    <email>23478901@qq.com</email>
    <username>封</username>
    <code>5625362</code>
  </student>
  <student stuId="5">
    <name>王三三</name>
    <email>23478901@qq.com</email>
    <username>封</username>
    <code>5625362</code>
  </student>
  <student stuId="5">
    <name>王海还</name>
    <email>23478901@qq.com</email>
    <username>封</username>
    <code>5625362</code>
  </student>
</node>
  1. iOS访问
//
//  ViewController.h
//  GETandPOST
//
//  Copyright © 2019 deerwang. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "Student.h"

@interface ViewController : UITableViewController
@property (nonatomic, strong) NSArray *stuList;
- (IBAction)getFunc;
@end




//
//  ViewController.m
//  GETandPOST
//  Copyright © 2019 deerwang. All rights reserved.
//

#import "ViewController.h"


@interface ViewController () <UITableViewDelegate,UITableViewDataSource>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self getFunc];
}

- (IBAction)getFunc {
    
    [self.refreshControl beginRefreshing];
}

//点击登录 触发get/post函数,获取网路请求;
-(IBAction)logClk:(id)sender {
    
    //[self getFunc];
}

-(void) setStuList:(NSArray *)stuList {
    _stuList = stuList;
    
    [self.tableView reloadData];
}

#pragma mark - 表格的数据源方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.stuList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 1.创建cell
    static NSString *ID = @"CELL";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    
    // 2.设置cell的数据
    Student *student = self.stuList[indexPath.row];
    
    cell.textLabel.text = student.name;
    
    return cell;
}
@end


//DWXMLViewController是一个继承ViewController的子类
//
//  DWXMLViewController.h
//  GETandPOST
//
//  Copyright © 2019 deerwang. All rights reserved.
//

#import "ViewController.h"

NS_ASSUME_NONNULL_BEGIN

@interface DWXMLViewController : ViewController

@end

NS_ASSUME_NONNULL_END


//
//  DWXMLViewController.m
//  GETandPOST
//
//  Copyright © 2019 deerwang. All rights reserved.
//

#import "DWXMLViewController.h"

@interface DWXMLViewController () <NSXMLParserDelegate>
//xml
@property (nonatomic, strong) NSMutableArray *dataList;
@property (nonatomic, strong) NSMutableString *elementString;
@property (nonatomic, strong) Student *student;
@end

@implementation DWXMLViewController


#pragma makr 数据相关
- (IBAction)getFunc {
    [super getFunc];
    //登录完成前不能做其他操作
    //登录操作异步执行 不会影响到其他操作。
    NSString *str = [NSString stringWithFormat:@"http://localhost/xml.xml"];
    NSURL *urlStr = [NSURL URLWithString:str];
    
    //枚举类型参数cachePolicy为0 功能无效 效率更高。10s后超时
    NSURLRequest *request = [NSURLRequest requestWithURL:urlStr cachePolicy:0 timeoutInterval:10.0f];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
        if (connectionError ) {
            NSLog(@"errpr: %@", connectionError.localizedDescription);
        } else {
            //将数据解析xml前的准备
            NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
            
            //设置代理
            parser.delegate = self;
            
            //开始解析
            [parser parse];
        }
    }];
    
    //外部登录不影响其他异步操作
    NSLog(@"main thread...");
}

#pragma mark -  NSXMLParserDelegate xml解析代理方法
#pragma mark 1.开始解析
- (void)parserDidStartDocument:(NSXMLParser *)parser {
    NSLog(@"开始解析文档");
    //拼接数组初始化
    if (!self.dataList) {
        self.dataList = [NSMutableArray array];
    } else {
        [self.dataList removeAllObjects];
    }
    
    //拼接字符串初始化
    if(!self.elementString) {
        self.elementString = [NSMutableString string];
    } else {
        //清空字符串的内容
        [self.elementString setString:@""];
    }
}

#pragma mark 2.开始节点
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary<NSString *,NSString *> *)attributeDict {
    NSLog(@"开始节点:%@m %@", elementName, attributeDict);
    if([elementName isEqualToString:@"student"]) {
        self.student = [[Student alloc] init];
        self.student.stuId = (NSNumber *)attributeDict[@"stuId"];
    }
    //没开始一个新节点删除之前的elementString数据
    [self.elementString setString:@""];
}

#pragma mark 3.查找内容,重复调用多次
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [self.elementString appendString:string];
    NSLog(@"%@", string);
}

#pragma mark 4.结束节点
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    NSLog(@"结束节点:%@", elementName);
    //判断 如果结尾是字段结束的标签 需要复制到对象当中
    if ([elementName isEqualToString:@"student"]) {
        [self.dataList addObject:self.student];
    } else if (![elementName isEqualToString:@"node"]) {  //只要结束 就对对象进行kvc赋值
        [self.student setValue:self.elementString forKey:elementName];
    }
}

#pragma mark 5.解析结束
- (void)parserDidEndDocument:(NSXMLParser *)parser {
    NSLog(@"文档解析完成");
    
    NSLog(@"%@", self.dataList);
    [self.dataList enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"---%@", obj);
    }];
    
    dispatch_async(dispatch_get_main_queue(), ^{
        //将不可变赋值给可变类型加copy
        self.stuList = [self.dataList copy];
        [self.refreshControl endRefreshing];
    });
}

#pragma mark 6.解析报错
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
    NSLog(@"error:%@", parseError.localizedDescription);
}

@end
  1. 其中getFunc函数是IBAction, 需要与refresh连线


    在这里插入图片描述

    加载的类需要更换一下


    在这里插入图片描述
  2. 运行结果:


    在这里插入图片描述

可以动态修改xml文件内容,然后下拉刷新更新展示

解析json数据, 同xml文件一样

  1. json.txt文件
[{"stuId": "1","name": "张鹏","email": "1234567890@qq.com","username": "一样菜","code": "985931"},{"stuId": "2","name": "王ss黑","email": "2345678901@qq.com","username": "冰封","code": "5625362"},{"stuId": "2","name": "王ss黑","email": "2345678901@qq.com","username": "冰封","code": "5625362"},{"stuId": "2","name": "王黑","email": "2345678901@qq.com","username": "冰封","code": "5625362"}]
  1. iOS访问,注意:
    NSURL *url = [NSURL URLWithString:@"http://localhost/json.txt"],这里的url也可以直接填写本地文件的路径
DWJSONViewController继承ViewController的子类
//
//  DWJSONViewController.m
//  GETandPOST
//
//  Copyright © 2019 deerwang. All rights reserved.
//

#import "DWJSONViewController.h"

@interface DWJSONViewController ()

@end

@implementation DWJSONViewController

- (void)getFunc
{
    // 显示刷新控件
    [super getFunc];
    
    // 1. URL
    NSURL *url = [NSURL URLWithString:@"http://localhost/json.txt"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:0 timeoutInterval:10];
    
    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
        if (data) {
            // 反序列化
            NSArray *array = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
            
            // 建立数组
            NSMutableArray *arrayM = [NSMutableArray array];
            
            [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
                Student *stu = [[Student alloc] init];
                
                [stu setValuesForKeysWithDictionary:obj];
                NSLog(@"%@", obj);
                
                [arrayM addObject:stu];
            }];
            
            dispatch_async(dispatch_get_main_queue(), ^{
                self.stuList = [arrayM copy];
                
                [self.refreshControl endRefreshing];
            });
        } else {
            NSLog(@"error:%@", connectionError.localizedDescription);
        }
        
    }];
}

@end

相关文章

  • iOS程序访问服务器-实战篇二

    本篇模拟对服务器返回xml数据以及json数据进行解析操作,获取指定值 运行apachesudo apachect...

  • iOS程序访问服务器-实战篇一

    为什么不可以直接用iOS程序直接访问服务器上的数据库?,因为app容易被逆向工程破解,数据库账号密码被获取存在信息...

  • 初涉网络编程

    一:实验目标 实现一个简单的客户服务器GUI小程序 二:实验要求 1 、服务器程序最多同时接受5个客户的访问。2 ...

  • iOS沙盒目录介绍

    iOS应用程序只能访问自己的目录,这个目录称为沙箱目录,而应用程序间禁止数据的共享和访问。iOS沙盒目录结构如下:...

  • CDN

    CDN过程: 访问CDN的DNS服务器, 得到了CDN的负载均衡服务器地址 程序访问负载均衡服务器, 得到了缓存服...

  • Tomcat服务器的使用

    目录介绍(3个重要) tomcat服务器访问网址 启动和关闭Tomcat主程序 播放器项目访问地址

  • 推送机制

    1、Provider:就是为指定IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那...

  • iOS安全审计入门

    iOS沙盒 iOS沙盒机制简述起来就是,iOS应用程序只能在为该程序创建的文件系统中读取文件,不可以去其他地方访问...

  • golang实现简易http服务器以及关键函数分析

    简易HTTP服务器的实现 先看一个使用net/http包实现的简单服务器程序示例。 运行程序,打开浏览器,访问ht...

  • iOS股票K线图

    mark:iOS股票K线图 iOS 股票K线图绘制 iOS 股票K线图绘制 从零开始实现k线图走势图绘制(iOS实战篇)

网友评论

      本文标题:iOS程序访问服务器-实战篇二

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