//网络访问获取数据
//定义一个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. 重读 code complete 说说代码质量

    重读code complete 说说代码质量 2014年的第一篇文章本来计划写些过去一年的总结和新年展望,但是因为还有一些事情要过一阵才能完成,所以姑且不谈这个,说说最近重读code complete ...

  2. Azure ARM (9) 创建ARM模式下的虚拟机网络

    <Windows Azure Platform 系列文章目录> 笔者在之前几章内容中,创建了ARM Resource Group,然后在这个ARM Resource Group下创建Azu ...

  3. 22套新鲜出炉的 Web & Mobile PSD 用户界面素材

    在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...

  4. 20套高品质的 Mobile & Web 界面 PSD 素材免费下载

    在这里,我们向大家呈现20个新鲜出炉的矢量的免费 PSD 素材.这些素材来自著名的设计社区——Dribbble,这个网站的用户不断发布各种精美的用户界面,图标和网站布局,以帮助激励他人.这些免费素材不 ...

  5. JVM Tomcat性能实战

    本节只是介绍实战部分,具体的理论参数,请自行百度. 所需工具:linux服务器  Jmeter测试工具  xshell   一个web应用 Tomcat的JVM参数可以配置在catalina.sh,如 ...

  6. 可显示Android设备选择列表,并进入指定Android设备Console的Shell脚本

    如果PC上连接多部Android设备(包括Android模拟器),在进入Console时还需要使用adb -s deviceid shell.比较麻烦,本文为此编写了一个Shell脚本文件(需要在Li ...

  7. [爬虫资源]各大爬虫资源大汇总,做我们自己的awesome系列

      大数据的流行一定程序导致的爬虫的流行,有些企业和公司本身不生产数据,那就只能从网上爬取数据,笔者关注相关的内容有一定的时间,也写过很多关于爬虫的系列,现在收集好的框架希望能为对爬虫有兴趣的人,或者 ...

  8. Maven提高篇系列之(六)——编写自己的Plugin(本系列完)

    这是一个Maven提高篇的系列,包含有以下文章: Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) ...

  9. DES加密解密

    加密后生成Base64字符串,并去除'='字符. 加密后替换掉'+',这样加密后的字符串可以作为url参数传递. using System; using System.IO; using System ...

  10. java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)

    采用SSH框架时出现了 java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage ...