iOS下使用restkit测试restful架构下的数据交互
来源:互联网 发布:动画宣传片制作软件 编辑:程序博客网 时间:2024/05/21 15:45
这里mark下,忙完手里的测试以后写上restful的示例。下面直接说ios下如何使用。
这篇文章写的比较精简。目前只写了get方法。post delete,put 部分下次在补上。
准备工作
首先需要知道restful走的是json协议的数据。为了测试,需要利用服务器返回一段json。大家可以选用熟悉的方法返回。
这里说一个比较简单的学习测试方法。
mac下面开启webshare功能。也就是网络共享。
(10.9以后需要下载http://clickontyler.com/web-sharing/)
对于老的版本。在系统偏好设置->共享下面应该会有设置。
打开launchpad 输入ter 打开命令行。
输入命令
cd /Library/WebServer/Documentssudo vim articles.json按住快捷键i,复制粘贴内容
{ "articles": [ { "title": "RestKit Object Mapping Intro", "body": "This article details how to use RestKit object mapping...", "author": "Blake Watters", "publication_date": "7/4/2011" }, { "title": "RestKit 1.0 Released", "body": "RestKit 1.0 has been released to much fanfare across the galaxy...", "author": "Blake Watters", "publication_date": "9/4/2011" }]}Esc切换到视图以后。输入
:wq
同理在articles2.json文件内写入
{ "articles": [ { "title": "RestKit Object Mapping Intro", "body": "This article details how to use RestKit object mapping...", "author": { "name": "Blake Watters", "email": "blake@restkit.org" }, "publication_date": "7/4/2011" }]}
在命令行下输入
gem install cocoapodspod setup等待安装完成
其他内容可以参考学习http://blog.devtang.com/blog/2012/12/02/use-cocoapod-to-manage-ios-lib-dependency/
建立工程
打开xcode5在桌面新建1个Master-Detail Controller 项目,命名为restkitDemo工程。关闭。
命令行输入
cd ~/Desktop/restkitDemovim Podfile
输入
platform :ios, '5.0'pod 'RestKit', '~> 0.21.0'pod 'RestKit/Testing', '~> 0.21.0'pod 'RestKit/Search', '~> 0.21.0'
:wq保存退出以后
执行
pod install
安装restKit包。
安装完成以后输入
open restkitDemo.xcworkspace打开项目工程。
编写代码
基本的对象映射
新建Article文件。文件中实现1个从NSobject派生的类。
拷贝替换为一下代码
@interface Article : NSObject@property (nonatomic, copy) NSString* title;@property (nonatomic, copy) NSString* body;@property (nonatomic, copy) NSString* author;@property (nonatomic) NSDate* publicationDate;@end
切换到MasterViewController.m中。在
#import "DetailViewController.h"
下链接2个头文件。
#import "Article.h"#import <RestKit/RestKit.h>
修改ViewDidLoad方法代码为
- (void)viewDidLoad{ [super viewDidLoad];// Do any additional setup after loading the view, typically from a nib. [self.refreshControl beginRefreshing]; [self loadArticles];}
接着添加如下代码
- (void) loadArticles{ RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:[Article class]]; [articleMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"body": @"body", @"author": @"author", @"publication_date": @"publicationDate" }]; RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"articles" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/articles"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; [objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { RKLogInfo(@"Load collection of Articles: %@", mappingResult.array); if (!_objects) { _objects = [[NSMutableArray alloc] init]; } [_objects removeAllObjects]; [_objects addObjectsFromArray:mappingResult.array]; [self.refreshControl endRefreshing]; [[self tableView] reloadData]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { RKLogError(@"Operation failed with error: %@", error); }]; [objectRequestOperation start];}
修改tableView:cellForRowAtIndexPath:方法代码为
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; Article *object = _objects[indexPath.row]; cell.textLabel.text = object.title; cell.detailTextLabel.text = object.author; return cell;}
接下来修改detail中cell的style.
编译运行,没有意外会看到如下效果
对象与之间的关系映射
修改loadArticles方法代码为以下代码
RKObjectMapping *authorMapping = [RKObjectMapping mappingForClass:[Author class]]; [authorMapping addAttributeMappingsFromArray:@[@"name", @"email"]]; RKObjectMapping *articleMapping = [RKObjectMapping mappingForClass:[Article class]]; [articleMapping addAttributeMappingsFromDictionary:@{ @"title": @"title", @"body": @"body", @"publication_date": @"publicationDate" }]; [articleMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"author" toKeyPath:@"author" withMapping:authorMapping]]; RKResponseDescriptor * responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"articles" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]; NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/articles2"]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[responseDescriptor]]; [objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) { RKLogInfo(@"Load collection of Articles: %@", mappingResult.array); if (!_objects) { _objects = [[NSMutableArray alloc] init]; } [_objects removeAllObjects]; [_objects addObjectsFromArray:mappingResult.array]; [self.refreshControl endRefreshing]; [[self tableView] reloadData]; } failure:^(RKObjectRequestOperation *operation, NSError *error) { RKLogError(@"Operation failed with error: %@", error); }]; [objectRequestOperation start];
修改tableView:cellForRowAtIndexPath:方法的代码为:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; Article *object = _objects[indexPath.row]; cell.textLabel.text = object.title; cell.detailTextLabel.text = object.author.name; return cell;}
修改Article.h中代码为
#import <Foundation/Foundation.h>@interface Author : NSObject@property (nonatomic, copy) NSString* name;@property (nonatomic, copy) NSString* email;@end@interface Article : NSObject@property (nonatomic, copy) NSString* title;@property (nonatomic, copy) NSString* body;@property (nonatomic) Author* author;@property (nonatomic) NSDate* publicationDate;@end
Article.m中代码为
#import "Article.h"@implementation Author@end@implementation Article@end
自此修改完成。编译运行。你会看到
关键部分
按照restkit的设计思路。
1个完整的过程分为
1:建立数据映射表。
2:建立返回的响应处理方式(增删改查的控制,构造中填写数据映射表)
3:新建1个url请求(注意,这里可以构造比较复杂的查询)
4:建立request操作,提交请求和返回处理方式。在block中处理成功与错误的返回。返回回来的数据会自动处理为对象。
分析下来还是比较好理解的。
- iOS下使用restkit测试restful架构下的数据交互
- iOS --- 使用RestKit与RESTful web服务器进行简单交互
- RestKit - 简化iOS程序调用RESTful Web Services的框架
- ios 使用webservice restful api使用ASIHttpRequest即可,restKit较大,可放后
- RESTKit的使用教程
- RESTKit的使用教程
- RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库
- linux下使用restclient工具测试restful services接口
- Jersey架构下的Restful接口学习笔记
- Jersey架构下的Restful接口学习笔记(二)
- iOS下的app和h5交互
- Django框架下的模板数据交互
- iOS开发之优秀开源代码解读:RESTKit的使用教程
- iOS 下的MVVMDemo的架构 DEMO
- SpringMVC框架下使用jQueryAJAX进行数据交互
- 讲解在java环境下使用jQuery进行JSON数据传送的交互过程
- Activity与内置网页(assets下)的数据交互简单使用
- IOS学习之路九(配置restful webservice 框架restkit)
- java的学习经历!
- Servlet下载文件
- 【栈】十进制转换成二进制的过程及算法实现
- Starting nagios:This account is currently not available.
- js中两个数的乘法
- iOS下使用restkit测试restful架构下的数据交互
- paip. 提升性能---hibernate的缓存使用 总结
- 重庆市ACM
- WTL for MFC Programmers, Part III - Toolbars and Status Bars
- using的三种用法
- Ubuntu安装codesourcery交叉编译器的问题
- 使用第三方库导致NSLog打印数组NSArray或字典NSDictionary时出现\U开头乱码的解决办法
- 【Android刷机】windows 7 fastboot mode下无法安装recovery的解决办法
- ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist