通过URL获取数据

本文介绍了在iOS中通过URL获取不同类型数据的方法,包括JSON、图片、Plist和XML数据。详细展示了利用AFNetworking库进行网络请求,并处理可能出现的错误,以及对数据的解析和缓存策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

URL获取json数据 、 获取图片、  XML数据  、获取plist文件

 1.如何通过URL获取json数据

  第一种,利用AFJSONRequestOperation,官方网站上给的例子:

  NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];


  NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


  NSURLRequest *request = [NSURLRequest requestWithURL:url];


  //    从URL获取json数据


  AFJSONRequestOperation *operation1 = [AFJSONRequestOperation JSONRequestOperationWithRequest:requestsuccess:^(NSURLRequest *request, NSHTTPURLResponse *response, NSDictionary* JSON) {


  NSLog(@"获取到的数据为:%@",JSON);


  } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id data) {


  NSLog(@"发生错误!%@",error);


  }];


  [operation1 start];


  第二种方法,利用AFHTTPRequestOperation 先获取到字符串形式的数据,然后转换成json格式,将NSString格式的数据转换成json数据,利用IOS5自带的json解析方法:


  NSString *str=[NSString stringWithFormat:@"https://alpha-api.app.net/stream/0/posts/stream/global"];


  NSURL *url = [NSURL URLWithString:[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


  NSURLRequest *request = [NSURLRequest requestWithURL:url];


  AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];


  [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {


  NSString *html = operation.responseString;


  NSData* data=[html dataUsingEncoding:NSUTF8StringEncoding];


  id dict=[NSJSONSerialization  JSONObjectWithData:data options:0 error:nil];


  NSLog(@"获取到的数据为:%@",dict);


  }failure:^(AFHTTPRequestOperation *operation, NSError *error) {


  NSLog(@"发生错误!%@",error);


  }];


  NSOperationQueue *queue = [[NSOperationQueue alloc] init];


  [queue addOperation:operation];


  如果发生Error Domain=NSURLErrorDomain Code=-1000 "bad URL" UserInfo=0x14defc80 {NSUnderlyingError=0x14deea10 "bad URL", NSLocalizedDescription=bad URL这个错误,请检查URL编码格式。有没有进行stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding


  2.如何通过URL获取图片


  异步获取图片,通过队列实现,而且图片会有缓存,在下次请求相同的链接时,系统会自动调用缓存,而不从网上请求数据。


  UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, 100.0f, 100.0f, 100.0f)];      [imageView setImageWithURL:[NSURL URLWithString:@"http://i.imgur.com/r4uwx.jpg"]placeholderImage:[UIImage imageNamed:@"placeholder-avatar"]];      [self.view addSubview:imageView];

  上面的方法是官方提供的,还有一种方法,


  NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.scott-sherwood.com/wp-content/uploads/2013/01/scene.png"]];


  AFImageRequestOperation *operation = [AFImageRequestOperation imageRequestOperationWithRequest:requestimageProcessingBlock:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) {


  self.backgroundImageView.image = image;


  } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) {


  NSLog(@"Error %@",error);


  }];


  


  [operation start];


  如果使用第一种URLWithString:  placeholderImage:会有更多的细节处理,其实实现还是通过AFImageRequestOperation处理,可以点击URLWithString:  placeholderImage:方法进去看一下就一目了然了。所以我觉得还是用第一种好。


  3.如何通过URL获取plist文件


  通过url获取plist文件的内容,用的很少,这个方法在官方提供的方法里面没有


  NSString *weatherUrl = @"http://www.calinks.com.cn/buick/kls/Buickhousekeeper.plist";


  NSURL *url = [NSURL URLWithString:[weatherUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];


  NSURLRequest *request = [NSURLRequest requestWithURL:url];


  [AFPropertyListRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];


  AFPropertyListRequestOperation *operation = [AFPropertyListRequestOperation propertyListRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id propertyList) {


  NSLog(@"%@",(NSDictionary *)propertyList);


  

  }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id propertyList) {


  NSLog(@"%@",error);


  }];


  


  [operation start];


  如果稍不留神,可能就出现Error Domain=AFNetworkingErrorDomain Code=-1016 "Expected content type {(


  "application/x-plist"


  )}, got text/plain" UserInfo=0x16e91ce0 {NSLocalizedRecoverySuggestion=


  


  ...


  ...


  , AFNetworkingOperationFailingURLRequestErrorKey= { }, NSErrorFailingURLKey=, NSLocalizedDescription=Expected content type {(


  "application/x-plist"


  )}, got text/plain, AFNetworkingOperationFailinponseErrorKey= { URL:  } { status code: 200, headers {


  "Accept-Ranges" = bytes;


  Connection = "keep-alive";


  "Content-Length" = 974;


  "Content-Type" = "text/plain";


  Date = "Sat, 25 Jan 2014 07:29:26 GMT";


  Etag = ""1014c2-3ce-4ee63e1c80e00"";


  "Last-Modified" = "Wed, 25 Dec 2013 23:04:24 GMT";


  Server = "nginx/1.4.2";


  


  } }}


  可能还会出现乱码,解决办法就是[AFPropertyListRequestOperation addAcceptableContentTypes:[NSSet setWithObject:@"text/plain"]];


  4.如何通过URL获取XML数据


  xml解析使用AFXMLRequestOperation,需要实现苹果自带的NSXMLParserDelegate委托方法,XML中有一些不需要的协议格式内容,所以就不能像json那样解析,还得实现委托。我之前有想过能否所有的XML链接用一个类处理,而且跟服务端做了沟通,结果很不方便,效果不好。XML大多标签不同,格式也不固定,所以就有问题,使用json就要方便的多。


  第一步;在.h文件中加入委托NSXMLParserDelegate


  第二步;在.m文件方法中加入代码


  NSURL *url = [NSURL URLWithString:@"http://113.106.90.22:5244/sshopinfo"];


  NSURLRequest *request = [NSURLRequest requestWithURL:url];


  AFXMLRequestOperation *operation =


  [AFXMLRequestOperation XMLParserRequestOperationWithRequest:request success:^(NSURLRequest *request,NSHTTPURLResponse *response, NSXMLParser *XMLParser) {


  XMLParser.delegate = self;


  [XMLParser setShouldProcessNamespaces:YES];


  [XMLParser parse];


  }failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, NSXMLParser *XMLParser) {


  NSLog(@"%@",error);


  }];


  [operation start];


  第三步;在.m文件中实现委托方法


  //在文档开始的时候触发


  -(void)parserDidStartDocument:(NSXMLParser *)parser{


  NSLog(@"解析开始!");


  }


  //解析起始标记


  - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{


  NSLog(@"标记:%@",elementName);


  

  }


  //解析文本节点


  - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{


  NSLog(@"值:%@",string);


  }


  //解析结束标记


  - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{


  NSLog(@"结束标记:%@",elementName);


  }


  //文档结束时触发


  -(void) parserDidEndDocument:(NSXMLParser *)parser{


  NSLog(@"解析结束!");


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值