//网络访问获取数据
//定义一个UIWebView属性,用来展示数据
@property (strong, nonatomic) IBOutlet UIWebView *myWebView; //....... //使用NSURLConnection发送异步请求获取数据
- (void)getData:(id)sender{
//访问的网站地址
NSString *str = @"http://www.apple.com/";
//实例化NSURL对象
NSURL *url = [NSURL URLWithString:str];
//实例化NSURLRequest对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//实例化操作队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //发送异步请求
[NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:
^(NSURLResponse *response, NSData *data, NSError *error) {
//获得网络抓取的数据
if ([data length] > 0 && error == nil){
//将NSData转换为NSString
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
//使用UIWebView显示网页
[self.myWebView loadHTMLString:html baseURL:nil];
NSLog(@"html = %@", html);
}
}];
} /*使用NSUrlConnection发送同步请求获得数据
使用同步请求的时候,最好在单独的一个线程中进行,
这样可以避免程序阻塞
*/
- (void)getDataTwo:(id)sender{
//全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //异步并行队列,开辟一个新线程
dispatch_async(queue, ^{
NSURL *url = [NSURL URLWithString:@"http://www.apple.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
NSURLResponse *response;
NSError *error; //NSURLConnection发送同步请求,获得数据
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; //判断结果
if ([data length] > 0 && error == nil){
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"html = %@", html);
}
});
}

  

/**
* 使用NSMutableURLRequest向服务器发送POST请求获取数据
*/
- (void)getDataThree:(id)sender{
//创建一个线程
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//执行异步任务
dispatch_async(queue, ^{
//获取新浪的天气预报信息网址
//http://php.weather.sina.com.cn/xml.php?city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0 //在block中从网络获取数据
NSString *str = @"http://php.weather.sina.com.cn/xml.php";
//创建NSURL对象
NSURL *url = [NSURL URLWithString:str];
//可变URL请求
NSMutableURLRequest *mRequest = [[NSMutableURLRequest alloc] init];
//为请求设置URL
[mRequest setURL:url];
//设置请求超时时间
[mRequest setTimeoutInterval:10];
//设置请求方法为post
[mRequest setHTTPMethod:@"POST"];
//body内容
NSString *body = @"city=%B1%B1%BE%A9&password=DJOYnieT8234jlsK&day=0";
//设置body
[mRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; //获得响应
NSURLResponse *response;
NSError *error;
//获得返回数据
NSData *data = [NSURLConnection sendSynchronousRequest:mRequest returningResponse:&response error:&error];
//将NSData转换成字符串
NSString *content = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; //使用UIWebView加载数据
[self.myWebView loadHTMLString:content baseURL:nil];
//输出结果
NSLog(@"content = %@", content); });
}

  

数据解析

在网络编程中,从服务器获取的数据格式大致分为两种:JSON和XML。其中JSON作为一种轻量级的数据交换格式,正在逐步取代XML, 成为网络数据的通用格式。

测试列子:调用一个天气预报的API, 地址是:http://m.weather.com.cn/data/101010100.html

/**
* 使用系统自带库NSJSONSerialization解析json数据
访问http://m.weather.com.cn/data/101010100.html ,返回结果为:
{"weatherinfo":{"city":"北京","city_en":"beijing","date_y":"2014年3月4日","date":"","week":"星期二","fchh":"11","cityid":"101010100","temp1":"8℃~-3℃","temp2":"8℃~-3℃","temp3":"7℃~-3℃","temp4":"8℃~-1℃","temp5":"10℃~1℃","temp6":"10℃~2℃","tempF1":"46.4℉~26.6℉","tempF2":"46.4℉~26.6℉","tempF3":"44.6℉~26.6℉","tempF4":"46.4℉~30.2℉","tempF5":"50℉~33.8℉","tempF6":"50℉~35.6℉","weather1":"晴","weather2":"晴","weather3":"晴","weather4":"晴转多云","weather5":"多云","weather6":"多云","img1":"0","img2":"99","img3":"0","img4":"99","img5":"0","img6":"99","img7":"0","img8":"1","img9":"1","img10":"99","img11":"1","img12":"99","img_single":"0","img_title1":"晴","img_title2":"晴","img_title3":"晴","img_title4":"晴","img_title5":"晴","img_title6":"晴","img_title7":"晴","img_title8":"多云","img_title9":"多云","img_title10":"多云","img_title11":"多云","img_title12":"多云","img_title_single":"晴","wind1":"北风4-5级转微风","wind2":"微风","wind3":"微风","wind4":"微风","wind5":"微风","wind6":"微风","fx1":"北风","fx2":"微风","fl1":"4-5级转小于3级","fl2":"小于3级","fl3":"小于3级","fl4":"小于3级","fl5":"小于3级","fl6":"小于3级","index":"寒冷","index_d":"天气寒冷,建议着厚羽绒服、毛皮大衣加厚毛衣等隆冬服装。年老体弱者尤其要注意保暖防冻。","index48":"冷","index48_d":"天气冷,建议着棉服、羽绒服、皮夹克加羊毛衫等冬季服装。年老体弱者宜着厚棉衣、冬大衣或厚羽绒服。","index_uv":"中等","index48_uv":"中等","index_xc":"较适宜","index_tr":"一般","index_co":"较舒适","st1":"7","st2":"-3","st3":"8","st4":"0","st5":"7","st6":"-1","index_cl":"较不宜","index_ls":"基本适宜","index_ag":"易发"}}
*/
- (void)getWeatherData:(id)sender{
NSURL *url = [NSURL URLWithString:@"http://m.weather.com.cn/data/101010100.html"];
NSURLRequest *requst = [NSURLRequest requestWithURL:url]; //发送异步请求
[NSURLConnection sendAsynchronousRequest:requst queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { if ([data length] > 0 && error == nil){
//将NSData转换成NSDictionary
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
//结果为字典中有字典,获得key为weatherinfo的字典
NSDictionary *dic2 = [dic objectForKey:@"weatherinfo"];
//遍历字典
for (NSString *key in dic2) {
NSLog(@"%@:%@", key, [dic2 objectForKey:key]);
}
}
}];
}

  

XML解析可以通过苹果自带的API -> NSXMLParser和其代理类NSXMLParserDelegate。

NSXMLParseDelegate代理类中有一组方法用来检测文档的读取状态,例如,文档开始、文档结束、元素开始、元素结束、内容开始等;

解析XML数据的基本思路是,在元素开始时创建一个空对象,找到内容时,读取内容并为对象的属性赋值,元素结束时将对象添加到集合中。

示例代码:

//创建一个Customer类
@interface Customer : NSObject @property (nonatomic, assign) int cid; //客户id
@property (nonatomic, retain) NSString *name;//客户姓名
@property (nonatomic, assign) int age; //客户年龄 @end

  

//先定义4个属性
@property (nonatomic, retain) Customer *customer; //客户实例
@property (nonatomic, retain) NSXMLParser *parser; //xml解析器
@property (nonatomic, retain) NSMutableArray *array; //可变数组
@property (nonatomic, strong) NSString *currrentElement; //当前元素 //初始化方法
- (void)initParser{
//初始化数组,用来容纳客户对象
self.array = [NSMutableArray arrayWithCapacity:10];
//获得客户XML文件的URL路径
NSString *str = [[NSBundle mainBundle] pathForResource:@"customers" ofType:@"xml"];
//将客户XML转换成NSData
NSData *data = [[NSData alloc] initWithContentsOfFile:str];
//实例化XML解析器
self.parser = [[NSXMLParser alloc] initWithData:data];
//设置代理
self.parser.delegate = self;
} /**
* 实现协议代理方法
*/
//读文档开始
- (void)parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"parserDidStartDocument...");
} //读文档结束
- (void)parserDidEndDocument:(NSXMLParser *)parser{
NSLog(@"parserDidEndDocument....");
} //读元素开始
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
NSLog(@"didStartElement...");
self.currrentElement = elementName;
if ([self.currrentElement isEqualToString:@"customer"]){
self.customer = [[Customer alloc] init];
}
} //找到内容
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
NSLog(@"foundCharacters...."); if ([self.currrentElement isEqualToString:@"id"]){
int cid = [string integerValue];
[self.customer setCid:cid];
}
else if ([self.currrentElement isEqualToString:@"name"]){
[self.customer setName:string];
}
else if ([self.currrentElement isEqualToString:@"age"]){
[self.customer setAge:[string integerValue]];
}
} //读元素结束
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(@"didEndElement..."); if ([elementName isEqualToString:@"customer"]){
[self.array addObject:self.customer];
}
self.currrentElement = nil;
} //开始解析方法
- (void)parse:(id)sender{
//删除数组中的所有数据
[self.array removeAllObjects];
//开始解析
[self.parser parse];
//获得数组大小
NSInteger count = [self.array count];
}

  

 

ios网络编程学习的更多相关文章

  1. iOS网络编程模型

    iOS网络编程层次结构也分为三层: Cocoa层:NSURL,Bonjour,Game Kit,WebKit Core Foundation层:基于 C 的 CFNetwork 和 CFNetServ ...

  2. [转]Windows网络编程学习-面向连接的编程方式

    直接附上原文链接:windows 网络编程学习-面向连接的编程方式

  3. IOS网络编程——第三方类库

    IOS网络编程——第三方类库 目录 概述 ASIHttpRequest AFNetworking 其他 概述 ASIHttpRequest AFNetworking 其他

  4. IOS网络编程:HTTP

    IOS网络编程:HTTP HTTP定义了一种在服务器和客户端之间传递数据的途径. URL定义了一种唯一标示资源在网络中位置的途径. REQUESTS 和 RESPONSES: 客户端先建立一个TCP连 ...

  5. iOS网络编程笔记——Socket编程

    一.什么是Socket通信: Socket是网络上的两个程序,通过一个双向的通信连接,实现数据的交换.这个双向连路的一端称为socket.socket通常用来实现客户方和服务方的连接.socket是T ...

  6. C,C++网络编程学习简明指南

    C,C++网络编程学习简明指南 1. 扎实的C,C++基础知识 参考资料<C程序设计>,<C++ primer>. 2. TCP/IP协议 经典书是:W.Richard Ste ...

  7. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  8. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  9. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

随机推荐

  1. 反应堆模式最牛的那篇论文--由solidmango执笔翻译

    The Reactor:An Object-Oriented Wrapper for Event-Driven Port Monitoring and Service Demultiplexing 反 ...

  2. 【转载】ASP.NET MVC Web API 学习笔记---第一个Web API程序

    1. Web API简单说明 近来很多大型的平台都公开了Web API.比如百度地图 Web API,做过地图相关的人都熟悉.公开服务这种方式可以使它易于与各种各样的设备和客户端平台集成功能,以及通过 ...

  3. C语言学习011:带参数的main函数

    直接上代码 #include <stdio.h> int main(int argc,char *argv[]){ printf("%i \n",argc); int ...

  4. ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化

    首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...

  5. Extjs中全键盘操作,回车跳到下一单元格

    listeners: { afterRender: function (thisForm, options) { var els = Ext.DomQuery.select('input[type!= ...

  6. 用 Inkspace 做 SVG 给 TPath

    FireMonkey 里的 TPathData 支持 SVG 的基本绘图指令,因此可以运用 Inkspace 软件,提取 SVG 的绘图内容,请见图片说明:

  7. hibnate 创建表的时候type=innodb报错

    这个原因是在MYSQL5.5及以后版本中type=InnoDB 由ENGINE=InnoDB  代替. 解决办法,自己定义一个方言: package com.hotusm.dialect; /** * ...

  8. Java就业指导

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊的东西,你可以把这些内 ...

  9. java 内部类 *** 最爱那水货

    注: 转载于http://blog.csdn.net/jiangxinyu/article/details/8177326 Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类.内部类又 ...

  10. C语言的关键字,运算符,标识符

    关键字 数据类型修饰相关 auto按照自动的方式进行变量的存储 const定义常量或常参数 extern声明外部变量或函数 register指定变量的存储类型是寄存器变量 static指定变量的存储类 ...