iOS下使用restkit测试restful架构下的数据交互

iOS三大开源框架AFNetworking、Three20与RestKit深度解析 在移动开发领域,网络通信和UI构建是iOS应用开发的核心技术环节。AFNetworking作为基于NSURLSession的封装框架,通过模块化设计实现了高效的网络请求管理,其内置的HTTPS安全策略和请求序列化机制大幅提升了开发效率。Three20框架源自Facebook客户端实践,其CSS-inspired的样式系统和优化的UITableView实现,为复杂UI界面开发提供了可靠解决方案。RestKit则专注于RESTful服务集成,通过对象映射系统简化了JSON到本地模型的转换过程。这三个经过商业验证 阅读详情

这里mark下,忙完手里的测试以后写上restful的示例。下面直接说ios下如何使用。


这篇文章写的比较精简。目前只写了get方法。post delete,put 部分下次在补上。


准备工作

首先需要知道restful走的是json协议的数据。为了测试,需要利用服务器返回一段json。大家可以选用熟悉的方法返回。

这里说一个比较简单的学习测试方法。

mac下面开启webshare功能。也就是网络共享。

(10.9以后需要下载http://clickontyler.com/web-sharing/)


对于老的版本。在系统偏好设置->共享下面应该会有设置。


打开launchpad 输入ter 打开命令行。

输入命令

cd /Library/WebServer/Documents
sudo 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"
    }]
}



安装cocoapods包管理工具

在命令行下输入

gem install cocoapods
pod setup
等待安装完成
其他内容可以参考学习 http://blog.devtang.com/blog/2012/12/02/use-cocoapod-to-manage-ios-lib-dependency/

建立工程

打开xcode5在桌面新建1个Master-Detail Controller 项目,命名为restkitDemo工程。关闭。
命令行输入
cd ~/Desktop/restkitDemo
vim 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中处理成功与错误的返回。返回回来的数据会自动处理为对象。

分析下来还是比较好理解的。
深入理解RestKit:iOS/macOS的RESTful服务交互框架 在当今互联网飞速发展的时代,REST(Representational State Transfer)架构风格已成为构建Web服务的标准方式之一。RESTful架构的核心理念在于简化网络服务的交互,利用HTTP协议的特性和标准,以及统一资源标识符(URI)进行资源的定位。与传统的SOAP服务相比,RESTful服务更加轻量级,易于理解和使用。RestKit是一套用于iOS和OS X平台的 Objective-C 网络抽象层。 阅读详情

相关推荐

基于BFQ19S的共射振荡器设计(克拉泼电容三点式)

根据理论,设计出如下LC振荡器: 一、设计初期是使用= 400Mhz作为目标值计算的, 但由于计算值与实际值有差别,所以使用计算值附近的元器件代替使用;最终该电路的L1=82nH , D1 = 5.6pF, C11=18pF, C12 = 18pF ; 另外R3= 600Ω, R4取27k , C9取10pF; 该电路实际的震荡频率为主要为L1,D1 决定,所以其震荡频率约为 == 235Mhz; 二、由于实际得到的频率比目标频率低太多,所以调整电路使其能达到400M左...

rzchong1988的专栏 3704

iOS开发之优秀开源代码解读:RESTKit的使用教程

马上要开始一个关于体育赛事直播的新项目,数据逻辑比较复杂,数据处理这块如果按照以前的积累无疑会选择 AFNetworking+JSONKit+MagicalRecord.这种模式使用起来轻便,可定制性高,缺点就是在处理复杂数据时太费时间。考量得失和项目的需要,决定采用RestKit。其实RestKit在开源社区早就享有盛名,许多人会拿他和AFNetworking相互比较,在我看来两者侧重点不同,没

zhonggaorong的专栏 4338

4万字一文带你看懂车载摄像头技术、市场、发展前景

1、小孔成像 在战国初期,我国学者墨子(公元前468年-公元前376年)和弟子们完成了世界上第一个小孔成像的实验,并记录在《墨经》中:“景到,在午有端,与景长。说在端。”“景。光之人,煦若射,下者之人也高;高者之人也下。足蔽下光,故成景于上;首蔽上光,故成景于下。在远近有端,与于光,故景库内也。” 此文解释了小孔成倒像的原因,指出了光沿直线传播的性质。这是对光直线传播的第一次科学解释。 而西方世界直到公元前350年,古希腊学者亚里士多德提出光学法则,西方人从此了解小孔成像的光学原理。

m0_58838529的博客 1492

ios进行restful接口调用和json数据利用自带NSJSONSerialization进行数据解析

ios中进行request进行restful的post方式接口的调用,并利自身的json数据的解析方法进行数据的获取

木兰缀露博客 2721

ICCompiler II学习笔记(一)ICC II使用全流程 overview

学习笔记同步发布在我的个人网站上,欢迎来访查看。 个人学识有限,理解可能有误,仅供参考。 文章目录一、前言二、 ICC II 简介和 GUI2.1 Blocks 和 Design Libraries2.2 Objects2.3 Application Options三、Design Setup四、APR flow五、 课程主题:如何用 ICC II来实现最好的PPA 一、前言 现在的芯片都在追求一个极致的PPA 芯片的生成可以分为以下 5大步骤: Front-end Design:前端设计,最终产生

一名FPGA芯片设计爱好者的技术博客 2万+

分享一个N-MOS管和P-MOS管驱动应用实例

大家好,我是『芯知识学堂』的SingleYork,今天给大家分享一下MOS管驱动相关的知识。 MOS管在电路设计中是比较常见的,按照驱动方式来分的话,有两种,即:N-MOS管和P-MOS管。MOS管跟三极管的驱动方式有点类似,但又不完全相同,那么今天笔者将会给大家简单介绍一下N-MOS管和P-MOS管的工作原理,并结合自己实际的应用来给大家分享一下如何来驱动N-MOS管和P-MOS管。 首先,我们先来看一下N-MOS管和P-MOS管分别在电路中的电气符号: 咋一看上面两个电气符号,似乎非常的相似,可能让很

『芯知识学堂』SingleYork 的博客 3万+

IOS网络请求方法之restfull请求

之前做网络请求的时候,大部分时候都是用的三方AFNetWorking的库来进行网络请求的封装和调用,对于常规的GET请求已经POST请求使用起来非常容易,但是后面在实际项目中遇到了利用PHP写的后台,要求使用restFull请求进行网络请求,翻遍了很多资料都无果,后来终于了解到了一种NSURLSession系统库的restfull请求解决方案,以此来分享给大家。   大家都知道restFull请

成都IOS小牛的博客 2521

Unity游戏开发客户端C#基础

初级Unity客户端开发工程师 面经 之 C#篇

Sea3752的博客 2万+

iOS restful使用不同的http访问方法请求URL

restful是一种设计风格,知识提供一组设计原则和约束条件,主要用于客户端和服务器交互类的软件;restful使用不同的http访问方法请求URL,由服务器端人员开发,前端人员使用,http的请求方法有get ,post,head,put,delete,options,trace,connect,patchget------获取数据----------datataskpost-------新增上...

代码解释生活 3001

RK3568驱动 SPI主/从 配置

RK3568 SPI 配置指南 内核配置:启用用户空间驱动(主)和从模式协议支持。 主模式:设备树设置status="okay"、max-freq及引脚复用,子节点compatible="rockchip,spidev"。 从模式:需添加spi-slave属性,子节点命名以slave@X开头。 编译烧写:修改设备树后编译内核或全量镜像,验证/dev/spidevX.Y节点。 测试:使用spidev_test工具,主模式可环回测试,从模式需与主设备通信。 (关键:从模式强制spi-slave和命名规则,频率匹

文石_2009的博客 1143

深入浅出块I/O子系统(四)请求处理过程

BIO请求处理的流程 函数scsi_request_fn()代码(摘自文件drivers/scsi/scsi_lib.c) (1)static void scsi_request_fn(struct request_queue *q) (2)int scsi_dispatch_cmd(struct scsi_cmnd *cmd) { host->hostt->queuecommand(host, cmd) } (3)struct sas_internal *i sas_queuec

sinat_37817094的博客 1347

iOS --- 使用RestKit与RESTful web服务器进行简单交互

RestKit是一款专为iOS设计的Objective-C框架,旨在与RESTful web服务的交互变得更简单快速。它基于强大的对象映射系统,并且结合了一个干净、简单的HTTP请求/响应API,大大减少了开发人员开发过程中所需的代码量。

icetime17的专栏 4361

华为OD机试 - 字符串筛选排序 - 数组(Python/JS/C/C++ 双机位C卷 100分)

k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引。输入一个由N个大小写字母组成的字符串,按照ASCII码值从小到大进行排序,查找字符串中第K个最小ASCII码值的字母(k>=1)。k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母则输出字母的最小位置索引。输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。第二行输入k ,k必须大于0 ,k可以大于输入字符串的长度。

学Java,找哪吒 1391

RestKit终极指南:如何在iOS与OS X间实现RESTful数据模型一致性

RestKit是一个用于在iOS和OS X上消费和建模RESTful Web资源的强大框架,它能够帮助开发者轻松实现客户端与服务器之间的数据交互和模型一致性。无论是构建简单的API集成还是复杂的企业级应用,RestKit都能提供高效、可靠的解决方案。 ## 为什么选择RestKit? 在移动应用开发中,处理RESTful API交互和数据模型转换往往是一项繁琐的任务。RestKit通过提供一系

gitblog_00334的博客 814

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RestKit ,一个用于更好支持RESTful风格服务器接口的iOS库

简介RestKit 是一个用于更好支持RESTful风格服务器接口的iOS库,可直接将联网获取的json/xml数据转换为iOS对象. 项目主页: RestKit 最新示例: 点击下载 注意: 如果无法直接运行示例根目录的工程,可尝试分别运行 Examples 文件夹下的各个子工程,此时你需要给每个子工程都通过 CocoaPods 安装一次 RestKit. 快速入门使用环境 ARC iOS 5.1

iOS122-移动混合开发研究院 984

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

RestKit 是一个用于更好支持RESTful风格服务器接口的iOS库

为什么80%的码农都做不了架构师?>>> ...

weixin_34197488的博客 120

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

<转>RestKit在iOS项目中的使用,包含xcode配置说明

最近在iPhone工程中添加RestKit并编译,但是由于之前找了很多不靠谱的说明文档,导致编译了一天也没有通过编译,总报出莫名其妙的错误。终于在最后的关头找了一篇英文的较为权威的文档才发现自己的问题出在一个很细节的地方。结论就是:不靠谱的文档害死人。 下面就总结一下怎么在xcode项目中使用Restkit。 1. 下载RestKit源码,到官网去下,下载后解压源码,不做过多解释; 2. 在

威尚 1310

<转>RestKit在iOS项目中的使用,包含xcode配置说明

最近在iPhone工程中添加RestKit并编译,但是由于之前找了很多不靠谱的说明文档,导致编译了一天也没有通过编译,总报出莫名其妙的错误。终于在最后的关头找了一篇英文的较为权威的文档才发现自己的问题出在一个很细节的地方。结论就是:不靠谱的文档害死人。 下面就总结一下怎么在xcode项目中使用Restkit。 1. 下载RestKit源码,到官网去下,下载后解压源码,不做过多解释; ...

diezhi9415的博客 173

RestKit Core Data 全文搜索:RKSearchIndexer 索引构建、RKSearchPredicate 查询与性能优化实战指南

RestKit 内置了面向 Core Data 实体的全文搜索组件(`Code/Search` 模块),让你无需引入 Lucene、SQLite FTS 等第三方依赖,即可为实体建立可检索的搜索索引:先对实体配置可搜索属性,随后通过 `RKSearchIndexer` 在保存时自动维护 "实体 → 搜索词" 的关系,最后用 `RKSearchPredicate` 构造的复合谓词配合标准 `NSFe

gitblog_00696的博客 211
上一篇: linux 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
下一篇: python下很帅气的爬虫包 - Beautiful Soup 示例
watsy
博客等级 码龄19年 133粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值