RestKit是一款專為iOS設計的Objective-C框架,旨在與RESTful web服務的交互變得更簡單快速。它基於強大的對象映射系統,並且結合了一個干淨、簡單的HTTP請求/響應API,大大減少了開發人員開發過程中所需的代碼量。
RestKit is a framework for consuming and modeling RESTful web resources on iOS and OS X.
主要特性:
1. 簡單高層次的HTTP請求/響應系統:RestKit在NSURLConnection的基礎上建立了HTTP客戶端,並且提供了一個有效方法庫來檢測MIME類型和狀態碼。同時讓提交表單數據變得更簡單,且一個本地參數對象還能夠輕松地創建多部分提交。
2. 框架支持切換服務器以及環境:RestKit使用基本的URL和資源路徑,而不是完整的URL,讓你可以快速地切換目標服務器。讓插值URL字符串和構建NSURL對象成為了過去式。
3. Core Data支持:以對象映射層為基礎,RestKit提供了與Apple的Core Data集成框架,用來擴展遠程資源映射到本地的對象。還提供一個很好地基於Core Data原語的API,用來簡化配置和查詢用例。
4. 對象映射系統:RestKit提供了一個建模層,有利於將映射進程數據負載到原生Cocoa對象聲明方式中去。這樣,程序員就不用擔心解析的問題,只需簡單的請求框架,異步獲取遠程資源以及調用委托結果即可。對象映射使用的是鍵值編碼來實現的,允許快速遍歷解析後的對象圖。反射是用在屬性類型上,以便將遠程日期編碼映射為字符串返回到NSDate對象。
5. 生成數據庫文件:當使用Core Data對象存儲時,你可以從數據文件集合中生成一個數據庫文件。這樣,你就可以將你的應用以及數據庫的應用程序包提交到App Store中,並且可以達到立即使用的效果。
6. 可插入解析層:RestKit目前通過SBJSON和YAJL解析器支持JSON。解析是在一個簡單接口背後實現的,允許額外的數據格式進行透明處理。
簡單的使用實例如下:
在這裡使用Python的flask搭建一個簡單的http server.
# -*- coding: utf-8 -*-
#!/usr/bin/python
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/')
def index():
return 'index'
#使用傳遞參數
@app.route('/hello/')
def hello_get(user):
return 'hello get %s' % user
#使用POST請求
@app.route('/hello/', methods=['POST'])
def hello_post(user):
return 'hello post %s' % user
@app.route('/json')
def hotCity():
return jsonify({
'article': {
'title': 'My Article',
'author': 'Blake',
'body': 'Very cool!!'
}
})
if __name__ == '__main__':
app.run()
這樣, 通過訪問http://127.0.0.1:5000/json即可獲取到article的數據.
新建Article類, 頭文件Article.h如下:
#import
@interface Article : NSObject
@property (nonatomic) NSString *title;
@property (nonatomic) NSString *author;
@property (nonatomic) NSString *body;
@end
通過RestKit獲取簡單的JSON數據, 步驟比較固定, 如下:
- (void)loadArticles {
NSURL *baseURL = [NSURL URLWithString:@http://127.0.0.1:5000];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
// 1. 初始化 RestKit, 與RESTful services交互
RKObjectManager *objectManager = [[RKObjectManager alloc] initWithHTTPClient:httpClient];
// 2. 建立 mappings, 用於配置JSON與本地Model的映射信息
RKObjectMapping *articleMapping = [RKObjectMapping mappingForClass:[Article class]];
// 3. 解析字段, 有多種方式.
// [articleMapping addAttributeMappingsFromArray:@[@title, @author, @body]];
[articleMapping addAttributeMappingsFromDictionary:@{
@title: @title,
@author: @author,
@body: @body
}];
NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful); // statuscode: 2xx
// register mappings with the provider using a response descriptor
// pathPattern: API路徑
// keyPath: 對象在JSON數據中的路徑
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping method:RKRequestMethodGET pathPattern:@/json keyPath:@article statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addResponseDescriptor:responseDescriptor];
// 4. 提交查詢
NSDictionary *queryParams = nil;
[[RKObjectManager sharedManager] getObjectsAtPath:@/json parameters:queryParams success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
_articles = mappingResult.array;
NSLog(@_articles.count : %ld, _articles.count);
Article *article = [mappingResult firstObject];
NSLog(@article : %@ - %@ - %@, article.title, article.author, article.body);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(@Failed to get articles...);
}];
}
結果如圖:
更多使用方法請參考RestKit的github主頁: RestKit.