iOS程序访问服务器-实战篇二
程序员文章站
2024-03-22 16:27:46
...
本篇模拟对服务器返回xml数据以及json数据进行解析操作,获取指定值
- 运行apache
sudo apachectl -k start - xml文件
http://localhost/xml.xml
<?xml version="1.0" encoding="UTF-8"?>
<node>
<student stuId="1">
<name>张鹏</name>
<email>aaa@qq.com</email>
<username>一样菜</username>
<code>985931</code>
</student>
<student stuId="2">
<name>王ss黑</name>
<email>aaa@qq.com</email>
<username>冰封</username>
<code>5625362</code>
</student>
<student stuId="3">
<name>阿顿</name>
<email>aaa@qq.com</email>
<username>封</username>
<code>5625362</code>
</student>
<student stuId="4">
<name>王二</name>
<email>aaa@qq.com</email>
<username>封</username>
<code>5625362</code>
</student>
<student stuId="5">
<name>王三三</name>
<email>aaa@qq.com</email>
<username>封</username>
<code>5625362</code>
</student>
<student stuId="5">
<name>王海还</name>
<email>aaa@qq.com</email>
<username>封</username>
<code>5625362</code>
</student>
</node>
- 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
- 其中getFunc函数是IBAction, 需要与refresh连线
加载的类需要更换一下
- 运行结果:
可以动态修改xml文件内容,然后下拉刷新更新展示
解析json数据, 同xml文件一样
- json.txt文件
[{"stuId": "1","name": "张鹏","email": "aaa@qq.com","username": "一样菜","code": "985931"},{"stuId": "2","name": "王ss黑","email": "aaa@qq.com","username": "冰封","code": "5625362"},{"stuId": "2","name": "王ss黑","email": "aaa@qq.com","username": "冰封","code": "5625362"},{"stuId": "2","name": "王黑","email": "aaa@qq.com","username": "冰封","code": "5625362"}]
- 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