- 浏览: 97138 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sincerehui:
android二维码的编码与解码(图片解码与摄像头解码) -
nyh1006:
学习一下!
UIScrollView循环滚动 -
bravewly:
为啥扫不出结果呢?是我扫的方式不对么?
android二维码的编码与解码(图片解码与摄像头解码) -
messigoogle:
我说您这个也是跟eoe上的差不多吧,加载的Assert中的图片 ...
android瀑布流 -
gundumw100:
LazyScrollView是偶写的。欢迎使用。呵呵。http ...
android瀑布流
使用的WebService是http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
其中的getWeatherByCityName函数
常使用的技术有:SOAP,HTTP GET, HTTP POST三种方式
(一) SOAP(简单对象访问协议)方式
当你使用SOAP时,必须用到POST方式
(1) SOAP 1.1
以下是请求实例:
POST /WebServices/WeatherWebService.asmx HTTP/1.1 Host: www.webxml.com.cn Content-Type: text/xml; charset=utf-8 Content-Length: length SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName" <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getWeatherbyCityName xmlns="http://WebXml.com.cn/"> <theCityName>string</theCityName> </getWeatherbyCityName> </soap:Body> </soap:Envelope>
请求方法:
- (void) soap1_1 { NSString *province=[NSString stringWithFormat:@"上海"]; //设置soap请求信息 NSString *soapString=[[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" "<soap:Body>" "<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">" "<theCityName>%@</theCityName>" "</getWeatherbyCityName>" "</soap:Body>" "</soap:Envelope>",province]; NSLog(@"%@",soapString); //soap请求地址 NSURL *url=[[NSURL alloc] initWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"]; //请求 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; //设置请求头部 ////设置ContentType [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; ////设置SOAPAction [request addValue:@"http://WebXml.com.cn/getWeatherbyCityName" forHTTPHeaderField:@"SOAPAction"]; //设置Content-length [request addValue:[NSString stringWithFormat:@"%d",[soapString length]] forHTTPHeaderField:@"Content-Length"]; //设置请求类型 POST或GET [request setHTTPMethod:@"POST"]; //设置请求Body(只有post方式有) [request setHTTPBody:[soapString dataUsingEncoding:NSUTF8StringEncoding]]; //连接 NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self]; if (connection) { webData=[NSMutableData data]; } }
(2) SOAP 1.2(除了soap不一样外,其他都一样)
以下是请求实例:
POST /WebServices/WeatherWebService.asmx HTTP/1.1 Host: www.webxml.com.cn Content-Type: application/soap+xml; charset=utf-8 Content-Length: length <?xml version="1.0" encoding="utf-8"?> <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope"> <soap12:Body> <getWeatherbyCityName xmlns="http://WebXml.com.cn/"> <theCityName>string</theCityName> </getWeatherbyCityName> </soap12:Body> </soap12:Envelope>
请求方法:
- (void) soap1_2 { NSString *province=[NSString stringWithFormat:@"上海"]; //设置soap请求信息 NSString *soapString=[[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>" "<soap12:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap12=\"http://www.w3.org/2003/05/soap-envelope\">" "<soap12:Body>" "<getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\">" "<theCityName>%@</theCityName>" "<theCityName>%@</theCityName>" "</getWeatherbyCityName>" "</soap12:Body>" "</soap12:Envelope>",province]; NSLog(@"%@",soapString); //soap请求地址 NSURL *url=[[NSURL alloc] initWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"]; //请求 NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; //设置请求头部 ////设置ContentType [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; ////设置SOAPAction [request addValue:@"http://WebXml.com.cn/getWeatherbyCityName" forHTTPHeaderField:@"SOAPAction"]; //设置Content-length [request addValue:[NSString stringWithFormat:@"%d",[soapString length]] forHTTPHeaderField:@"Content-Length"]; //设置请求类型 POST或GET [request setHTTPMethod:@"POST"]; //设置请求Body(只有post方式有) [request setHTTPBody:[soapString dataUsingEncoding:NSUTF8StringEncoding]]; //连接 NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self]; if (connection) { webData=[NSMutableData data]; } }
其实和soap1.1除了soap不一样 ,几乎全一样
(二) HTTP POST方式
请求实例:
POST /WebServices/WeatherWebService.asmx/getWeatherbyCityName HTTP/1.1 Host: www.webxml.com.cn Content-Type: application/x-www-form-urlencoded Content-Length: length theCityName=string
方法:
- (void) httpPost { NSString *postString=@"theCityName=上海"; //此处的URL是POST /WebServices/WeatherWebService.asmx/getWeatherbyCityName 见上! NSURL *url=[NSURL URLWithString:@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName"]; NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url]; [request addValue:@"application/x-www-form-urlencoded"forHTTPHeaderField:@"Content-Type"];//注意是中划线 [request addValue:[NSString stringWithFormat:@"%d",[postString length]] forHTTPHeaderField:@"Content-Length"]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]]; NSURLConnection *connection=[NSURLConnection connectionWithRequest:request delegate:self]; if (connection) { webData=[NSMutableData data]; } }
以上三种任选一种都可以。下面开始写余下的程序代码了。
——————ViewController文件——————
#import <UIKit/UIKit.h> @interface WebServiceViewController : UIViewController<NSURLConnectionDelegate,NSURLConnectionDataDelegate> { NSMutableData *webData; NSMutableArray *parserObjects; } @property (strong, nonatomic) NSMutableData *webData; @property (strong, nonatomic) NSString *m_strCurrentElement; @property (strong, nonatomic) NSMutableString *tempString; @end
——————NSURLConnectionDelegate,NSURLConnectionDataDelegate实现方法——————
//接收相应的时候触发 -(void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ [webData setLength:0]; } //接收数据的时候触发 -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [webData appendData:data]; } //全部完成时触发 -(void) connectionDidFinishLoading:(NSURLConnection *)connection{ NSString *dataString=[[NSString alloc] initWithBytes:[webData bytes] length:[webData length] encoding:NSUTF8StringEncoding]; NSLog(@"%@",dataString); //XML解析 NSXMLParser *xmlParser=[[NSXMLParser alloc] initWithData:webData]; [xmlParser setDelegate:self]; [xmlParser setShouldResolveExternalEntities:YES]; [xmlParser parse]; } //发生异常触发 -(void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"Error:%@",error); }
现在就应该能看到打印出来的返回数据了,我查了一些资料没找到webserive的解析,我只能用xml解析。
正好我可以学习一下xml的解析:
添加协议NSXMLParserDelegate
然后在
-(void) connectionDidFinishLoading:(NSURLConnection *)connection
方法里添加下面代码:
//XML解析 NSXMLParser *xmlParser=[[NSXMLParser alloc] initWithData:webData]; [xmlParser setDelegate:self]; [xmlParser setShouldResolveExternalEntities:YES]; [xmlParser parse];
—————— NSXMLParserDelegate实现方法——————
//开始时触发 - (void)parserDidStartDocument:(NSXMLParser *)parser { parserObjects = [[NSMutableArray alloc] init]; //每一组信息都用数组来存,最后得到的数据即在此数组中 } //解析xml标签对,开始时触发 - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { NSLog(@">>>%@",elementName); if ([elementName isEqualToString:@"ArrayOfString"]) { //开始解析ArrayOfString节点 NSLog(@"开始"); }else { //开始解析子节点 if ([elementName isEqualToString:@"string"]) { self.m_strCurrentElement = @"string"; self.tempString = [NSMutableString string]; } } } //找到标签时 - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { NSLog(@"found %@",self.m_strCurrentElement); //填充string if (self.m_strCurrentElement) { [self.tempString appendString:string]; NSLog(@"found is %@",string); } } //解析xml标签对,结束时触发 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { NSLog(@"end %@",self.m_strCurrentElement); //填充 if (self.m_strCurrentElement) { [parserObjects addObject:self.tempString]; self.m_strCurrentElement = nil; self.tempString = nil; } //结束解析ArrayOfString节点 if ([elementName isEqualToString:@"ArrayOfString"]) { NSLog(@"结束"); } } //结束时触发 - (void)parserDidEndDocument:(NSXMLParser *)parser { //由于标签对的名字都是一样的,只能这样获得 //天气图片 NSString *weatherImageName = [parserObjects objectAtIndex:8]; //今日天气实况 NSString *temperature = [parserObjects objectAtIndex:10]; NSString *imageName = [NSString stringWithFormat:@"a_%@",weatherImageName]; [self gifImageView:imageName]; [self.wendu setText:[self segmentation:temperature]]; }
由于今日天气实况的格式是:
今日天气实况:气温:26℃;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱
有时只需要气温,这样我们就要分割这个字符串,分割这个字符串有两种方法:分段,正则表达式。
1.分段
#pragma 分割 - (NSString *)segmentation:(NSString *)segmentationString { //今日天气实况:气温:26℃;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱 //取出 ————> 26℃ NSArray *segmentationArray1 = [segmentationString componentsSeparatedByString:@";"]; NSString *segmentationString1 = [segmentationArray1 objectAtIndex:0]; //今日天气实况:气温:26℃; NSArray *segmentationArray2 = [segmentationString1 componentsSeparatedByString:@":"]; NSString *segmentationResult = [segmentationArray2 objectAtIndex:2]; NSLog(@"segmentation : %@",segmentationResult); return segmentationResult; }
2.正则表达式
#pragma 正则表达式 - (void)regular:(NSString *)regularString { //今日天气实况:气温:26℃;风向/风力:北风 1级;湿度:78%;空气质量:良;紫外线强度:弱 //取出 ————> 26℃ NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"[0-9]*℃" options:0 error:nil]; //系统通过自有类NSRegularExpression和NSTextCheckingResult来实现正则表达式的创建和筛选 if (regex != nil) { NSTextCheckingResult *firstMatch = [regex firstMatchInString:regularString options:0 range:NSMakeRange(0, [regularString length])]; if (firstMatch) { NSRange resultRange = [firstMatch rangeAtIndex:0]; //从regularString中截取数据 NSString *result = [regularString substringWithRange:resultRange]; NSLog(@"regular %@",result); } } }
这样就可以只显示气温了。
有时候气温图片需要gif图
显示gif图的方法:
-(void)gifImageView:(NSString *)imageName { NSLog(@"%@",imageName); // 设定位置和大小 CGRect frame = CGRectMake(50,50,0,0); frame.size = [UIImage imageNamed:imageName].size; NSArray *imageArray = [imageName componentsSeparatedByString:@"."]; // 读取gif图片数据 NSData *gif = [NSData dataWithContentsOfFile: [[NSBundle mainBundle] pathForResource:[imageArray objectAtIndex:0] ofType:[imageArray objectAtIndex:1]]]; // view生成 UIWebView *webView = [[UIWebView alloc] initWithFrame:frame]; webView.userInteractionEnabled = NO;//用户不可交互 [webView loadData:gif MIMEType:@"image/gif" textEncodingName:nil baseURL:nil]; [self.view addSubview:webView]; }
这样就完成了,
这个demo主要就是练习。。有不对或者更好的方法,欢迎一起讨论。谢谢了。。。
源码看附件吧。。。
- WebService.zip (223.5 KB)
- 下载次数: 27
评论
打开工程一看不识别“NSURLConnectionDelegate,NSURLConnectionDataDelegate”协议,
估摸着不够新,有其它代替方式么
发表评论
-
IOS播放gif图
2012-09-10 11:10 13004-(void)gifImageView:(NSStrin ... -
UIScrollView循环滚动
2012-08-29 16:40 2165我弄了半天终于弄出UIScrollView循环了,分享一下,方 ... -
NSString与int和float的相互转换
2012-08-29 14:47 885NSString *tempA = @"123 ... -
iOS如何利用Delegate来实现两个UIView之间的传值
2012-08-23 13:50 1363转至:http://blog.csdn.net/whaomia ... -
切换两个UIVIew动画
2012-08-23 09:53 1179#pragma mark - Animation cod ... -
将UILabel旋转90度
2012-08-22 10:23 2938[*yourlabelname* setTransform:C ... -
UIAlertView的使用方法
2012-08-04 13:46 787UIAlertView类似于C#中的模态对话框 或 Me ... -
IOS隐藏键盘
2012-08-04 13:44 960//UITextField的Did End On Exi ...
相关推荐
在iOS应用开发中,创建一个天气预报APP是一个常见的实践项目,可以帮助开发者掌握基本的iOS编程技巧,特别是对于初学者来说。本项目的核心是利用JSON数据从远程服务器获取天气信息,并在Xcode环境下进行编码实现。...
在iOS平台上开发应用程序,尤其是天气预报类应用,涉及到的知识点非常广泛,涵盖了移动开发、网络编程、数据解析、用户界面设计等多个方面。以下是对"IOS应用源码——天气预报.zip"这一主题的详细分析。 首先,我们...
在iOS平台上为iPhone开发天气预报应用是一个常见的任务,涉及到多个技术层面。这个“ios iphone天气预报例子”提供了全面的功能,包括地图集成、GPS定位、导航以及城市添加等,这些都是构建一个实用天气应用不可或缺...
在iOS开发中,创建一个天气预报应用是一个常见的学习任务,对于初学者来说,这是一个很好的实践项目。本项目名为“天气预报 dome”,它旨在通过JSON API获取数据并展示天气信息,帮助开发者熟悉网络请求、JSON解析...
总的来说,"ios-天气预报app.zip"项目涵盖了iOS开发的多个核心方面,从网络请求到UI设计,再到地理定位和本地化。每个环节都涉及了丰富的技术细节,对于学习iOS开发或者提高iOS开发者技能来说,都是宝贵的实践案例。
在iOS开发领域,Objective-C是一种常用的编程语言,尤其在苹果的旧版框架和库中广泛使用。本项目“ios-天气预报.zip”显然是一个利用Objective-C编写的天气应用示例,旨在帮助开发者学习如何实现一个功能完备的天气...
总结来说,WeatherDemo作为一个iOS天气预报应用,不仅涵盖了XML数据解析、第三方库的集成,还涉及到自定义控件的编程实践,全面体现了iOS开发中的关键技能。通过学习和理解WeatherDemo的实现原理,开发者不仅可以...
利用聚合数据提供的接口做的一个天气预报DEMO做练习。需要的朋友也可以学着做,仅供参考。
总的来说,这个"简单的iOS天气预报Demo"是一个实用的教学实例,它涵盖了iOS开发中的关键技能,包括JSON解析、网络请求和API的使用,对于想要踏入iOS开发领域的初学者来说,是一个很好的起点。通过这个Demo,开发者...
综上所述,开发一款“iOS选择不同城市的天气预报”应用涵盖了网络编程、数据解析、用户界面设计、数据结构、地理定位、推送通知等多个领域的知识,需要开发者具备全面的iOS开发技能和良好的编程实践。
以上就是开发一个iOS天气预报应用所需掌握的关键技术点,通过这个过程,开发者不仅可以提升iOS开发技能,还能对网络编程、数据解析、UI设计等有更深入的理解。在实际项目中,还需要不断学习和实践,以适应不断变化的...
在iOS开发中,创建一个天气预报应用涉及到多个关键知识点,这里我将详细解析"ios 天气预报源代码"这个项目及其可能包含的组件和功能。 1. **天气API集成**: - 天气预报数据通常来自第三方API,如OpenWeatherMap、...
《iOS应用源码分析——基于天气预报的毕设学习》 在移动开发领域,iOS平台以其卓越的用户体验和丰富的功能特性吸引着众多开发者。本文将深入探讨一款名为“天气预报”的iOS应用源码,它是两年前的毕设项目,旨在为...
【标题】"ios应用源码之天气预报 2018127"指的是一个针对iOS平台开发的天气预报应用程序的源代码,日期为2018年12月7日。这个源码可能是开发者在该时间点完成或更新的一个项目版本,用于展示或学习如何在iOS平台上...
在iOS开发领域,源码是理解应用程序工作原理和学习新技能的重要资源。"IOS应用源码——天气预报.rar"提供了一个完整的iOS天气预报应用的源代码,这为开发者提供了研究和学习iOS应用开发,特别是与天气相关的API集成...
标题中的“用Hbuilder开发的一款手机天气预报App”揭示了我们正在讨论的项目是一个基于HBuilder框架构建的移动应用程序,其主要功能是提供天气预报服务。HBuilder是DCloud(数字天堂)推出的一个强大的HTML5开发工具...
【摘要】与【关键词】中提到的“基于iOS的天气预报查询系统”是一个移动应用程序,旨在为用户提供便捷的天气查询服务。该系统利用iOS平台进行开发,目的是帮助用户在任何时间、任何地点获取天气信息,提升生活的便利...
在iOS开发中,创建一个天气预报应用涉及到多个关键知识点,包括网络请求、数据解析、UI设计和音频播放。以下是对这些技术的详细说明: 1. **XML解析**:XML(Extensible Markup Language)是一种用于存储和传输数据...