SOA Server 是构建您的 Web 服务的好方法,它建立在 Silex 和 Doctrine 2 的基础上,但是使用 iOS 作为客户端,您无法获得同样的体验,直到现在。在长时间使用 SOA Server 之后,我决定使用相同的思维方式与 Objective-C 结合,结果是这个库。
为了使 SOA SDK 能够工作,您必须配置 API URL 和共享头信息。
[SOAManager defaultManager].apiURL = [NSURL URLWithString:@"http://serveraddress.com/api/v1"];
[SOAManager defaultManager].rpcURL = [NSURL URLWithString:@"http://serveraddress.com/rpc/v1"];
[[SOAManager defaultManager] setDefaultHeaders:@{@"Authorization" : @"_authorization_token_"}];
包括 REST API 中可用的各个 HTTP 方法的共享头信息。
SOAServiceMethodGET,
SOAServiceMethodPOST,
SOAServiceMethodPUT,
SOAServiceMethodDELETE,
SOAServiceMethodALL
[[SOAManager defaultManager] setDefaultHeaders:@{@"Content-Type" : @"application/x-www-form-urlencoded"} forMethod:SOAServiceMethodPOST];
[[SOAManager defaultManager] setDefaultHeaders:@{@"Content-Type" : @"application/x-www-form-urlencoded"} forMethod:SOAServiceMethodPUT];
目前,您可以为并发请求的队列限制进行配置,并且也可以将显示或隐藏网络活动状态的职责委托给 SOA SDK。
[SOAManager defaultManager].maxConcurrentRequests = 4;
[SOAManager defaultManager].controlNetworkActivity = YES;
SOAObject 是一个 NSObject 子类,用于存储实体的数据。SOAObject 只有一个强制性属性,即实体名称,但您可以设置实体 ID。这两个属性都是为了识别对象而设计的。
除此之外,您可以使用 setValue:forKey: 存储任何类型的数据(指针),也可以使用 valueForKey: 方法检索数据。
SOAObject *hotel = [[SOAObject alloc] initWithEntityName:@"hotel"];
SOAObject *knownHotel = [[SOAObject alloc] initWithEntityName:@"hotel" entityId:12];
[hotel setValue:@"Ibis" forKey:@"name"];
[hotel setValue:@"R. Nove de Março" forKey:@"street"];
NSString *name = [hotel valueForKey:@"name"];
[SOAObject getWithEntityName:@"hotel"
entityId:12
completionBlock:^(id result, NSError *error) {
SOAObject *object = (SOAObject *)result;
}];
[SOAObject saveEntity:@"hotel"
parameters:@{
@"id" : @(10),
@"name" : @"Bourbon",
@"street" : @"R. Visconde de Taunay"
}
completionBlock:^(id result, NSError *error) {
}];
[hotel saveWithCompletionBlock:^(id result, NSError *error) {
}];
[SOAObject getWithEntityName:@"hotel"
entityId:12
completionBlock:^(id result, NSError *error) {
SOAObject *object = (SOAObject *)result;
}];
[hotel deleteWithCompletionBlock:^(id result, NSError *error) {
}];
SOAQuery *query = [[SOAQuery alloc] initWithEntityName:@"hotel"];
query.offset = 0;
query.limit = 100;
query.fields = @[@"name", @"id"];
SOAFilter *filter = [SOAFilter where:@"id" equalTo:@26];
[query addFilter:filter];
SOAFilter *joinFilter = [SOAFilter where:@"id" equalTo:@10];
SOAJoin *join = [SOAJoin joinField:@"user" withFilter:joinFilter];
[query addJoin:join];
[query performQueryWithCompletionBlock:^(id result, NSError *error) {
NSLog(@"%@", result);
}];
SOARPCCall *rpc = [[SOARPCCall alloc] init];
[rpc callProcedure:@"/authentication/login"
parameters:@{@"email" : @"[email protected]", @"password" : @"passwd"}
headers:nil
completionBlock:^(id result, NSError *error) {
NSLog(@"%@", result);
NSLog(@"%@", error);
}];
从版本 0.1.3 开始,您可以使用 NSNotificationCenter 观察授权失败,通知名称为 SOAServiceAuthErrorNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(selector:) name:SOAServiceAuthErrorNotification object:nil];