ios - RestKit 使用对象发帖并获取对象响应

标签 ios post restkit restkit-0.20

我是 IOS 和 RestKit 的新手,不知道如何执行以下操作:

1. a simple POST to a webservice 
  A) with an object payload
  B) Have RestKit Auto Serialize the obj c object into Json

2. Receive the Response
  A) Parse response and extract only certain fields and load into obj c object

我的设置如下:

来自网络服务的 Json 响应:

{
    "user": {
          "id":0,
          "email":"String",
     },
     "errorCode": 0
}

来自 obj c 中 Web 服务的响应对象:

@interface CreateAccountResponse : NSObject

@property (nonatomic, copy) NSString *id;
@property (nonatomic, copy) NSString *email;
@property (nonatomic) NSInteger   *errorCode;

@end

在对象 C 中请求对象:

@interface CreateAccountRequestModel : NSObject

@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *password;
@property (nonatomic, copy) NSString *first_name;
@property (nonatomic, copy) NSString *last_name;

@end

Webservice 在 POST 请求中期望这个 Json:

{
    "email":"String",
    "password":"String",
    "first_name":"String",
    "last_name":"String"
}

URL 是:www.hostname.com/api/AccountManager/createAccount,它只接受 POST 请求。

我尝试过的:

-(void)SendCreateAccountRequest:(CreateAccountRequestModel*)createActModel
{
    NSString *createAccountUrl = @"www.hostname.com/api/AccountManager/createAccount";
    NSLog(@"SendCreateAccountRequest");
    RKObjectMapping* articleMapping = [RKObjectMapping mappingForClass:  [CreateAccountResponse class]];
    [articleMapping addAttributeMappingsFromDictionary:@{
                                                         @"id": @"user.id",
                                                         @"email": @"user.email",
                                                         @"errorCode": @"errorCode"
                                                         }];

    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:articleMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"createAccount" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

    NSURL *URL = [NSURL URLWithString:createAccountUrl];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    RKObjectRequestOperation *objectRequestOperation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:@[ responseDescriptor ]];

    [objectRequestOperation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
    {
        RKLogInfo(@"Successful Response: %@", mappingResult.array);
    }
    failure:^(RKObjectRequestOperation *operation, NSError *error)
    {
        RKLogError(@"Operation failed with error: %@", error);
    }];

    [objectRequestOperation start];

我知道我没有正确地将 Web 服务的响应映射到对象,也没有正确创建 POST 请求。就像我说的,我是新来的,所以你提供的细节越多越好:)

最佳答案

用户对象

@interface User : NSObject

@property (nonatomic, copy) NSString *id;
@property (nonatomic, copy) NSString *email;
@property (nonatomic, copy) NSString *password;
@property (nonatomic, copy) NSString *first_name;
@property (nonatomic, copy) NSString *last_name;

@end

发布http://www.hostname.com/api/AccountManager/createAccount

响应 JSON

{
    "id":0,
    "email":"String",
}

在服务器上创建

- (void)createUserOnServer:(User *)user
{
    RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[User class]];
    [responseMapping addAttributeMappingsFromArray:@[@"id",@"email"]];
    NSIndexSet *statusCodes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);
    RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodAny pathPattern:@"/createAccount" keyPath:@"article" statusCodes:statusCodes];

    RKObjectMapping *requestMapping = [RKObjectMapping requestMapping]; // objectClass == NSMutableDictionary
    [requestMapping addAttributeMappingsFromArray:@[@"email", @"password", @"first_name", @"last_name"]];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[Article class] rootKeyPath:nil method:RKRequestMethodAny];

    RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://www.hostname.com/api/AccountManager"];
    [manager addRequestDescriptor:requestDescriptor];
    [manager addResponseDescriptor:articleDescriptor];
    [manager postObject:user path:@"/createAccount" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
                NSLog(@"Create User Success");
            } failure:^(RKObjectRequestOperation *operation, NSError *error) {
                NSLog(@"Create User Error: %@", error);
            }];
}

PS:你最好完整阅读Restkit的README!!

PS2:HTTP statusCode 的错误代码更好

关于ios - RestKit 使用对象发帖并获取对象响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20463385/

相关文章:

ios - 使用 drawRect 绘制到我自己的 UIView

ios - 带有按钮的 ScrollView 可以在点击时出现和消失

当 content-type 为 application/x-www-form-urlencoded 时,Java 读取 POST 数据

iphone - 当 View Controller 被弹出时,处理 RestKit 请求的正确方法是什么?

objective-c - iOS 的 RestKit 或 ASIHTTPRequest 的替代品

objective-c - 关于应用内购买

android - Flutter In App Purchase : InAppPurchaseConnection. instance.queryProductDetails 返回空列表

python - 如何在 Python 中使用 urllib 在 thingspeak.com 中发布 API

ruby-on-rails - Rails 和 ajax 请求 : not using csrf working?

ios - 如何仅使用用户名和密码从简单的 RestKit 调用中获取响应?