无法让 RestKit 0.2 发布参数

Posted

技术标签:

【中文标题】无法让 RestKit 0.2 发布参数【英文标题】:Can't get RestKit 0.2 to POST parameters 【发布时间】:2014-02-13 18:32:29 【问题描述】:

所以我正在尝试使用[RKObjectManager postObject:path:parameters:success:failure:],但在使用我的登录 POST 请求时遇到了一些麻烦。出于某种原因,我不断收到来自服务器的回复,说电子邮件和密码的参数是必需的,即使我将以下字典传递给参数:

NSDictionary *params = @@"email": @"fakeEmail@fakeDomain.com, @"password": @"test123!";

当我注销RKObjectRequestOperation 时,它不会在请求中显示任何参数。我必须在请求中传递一个对象吗?如果是这样,我会传入什么对象?

(以前我只使用 and AFJSONRequestOperation,但我想更新应用程序以使用 RestKit 并利用它提供的简单对象映射)。

任何帮助将不胜感激。

编辑更多代码:

我有一个名为 UserAuthService 的 RKObjectManager 子类,使用 RKMIMETYPEJSON 作为 requestSerializationMIMEType,具有以下请求描述符设置:

// User
RKResponseDescriptor *userResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[UserAuthMappingProvider userMapping]
                                                                                                     method:RKRequestMethodPOST
                                                                                                pathPattern:@"user/login"
                                                                                                    keyPath:@"response.users"
                                                                                                statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[self addResponseDescriptor:userResponseDescriptor];

我实际请求的方法是:

- (void)logUserInWithEmail:(NSString *)email andPassword:(NSString *)password success:(void (^)(UserObject *))success failure:(void (^)(RKObjectRequestOperation *, NSError *))failure

// Request Params
NSDictionary *params = @@"email": email, @"password": password;
NSLog(@"Params: %@", params);


[self postObject:nil path:@"user/login" parameters:params
         success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
             if (success)
             
                 NSArray *userArray = [mappingResult array];
                 success([userArray firstObject]);
             

         
         failure:^(RKObjectRequestOperation *operation, NSError *error)
             NSLog(@"Error: %@", error);

             if (failure)
             
                 failure(operation, error);
             
         ];

UserAuthMappingProvider 中的 userMapping 方法如下所示:

+ (RKEntityMapping *)userMapping

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:appDelegate.managedObjectStore];
    userMapping.identificationAttributes = @[ @"uuid" ];

    [userMapping addAttributeMappingsFromDictionary:@@"email": @"email",
                                                      @"first_name": @"firstName",
                                                      @"last_name": @"lastName",
                                                      @"is_logged_in": @"isLoggedIn",
                                                      @"site_id": @"siteID",
                                                      @"user_name": @"username",
                                                      @"uuid": @"uuid"];
    return userMapping;

和 UserObject(在 .m 中每个都设置为 @dynamic):

@interface UserObject : NSManagedObject

@property (strong, nonatomic) NSString *email;
@property (strong, nonatomic) NSString *firstName;
@property (strong, nonatomic) NSString *lastName;
@property (assign, nonatomic) BOOL isLoggedIn;
@property (strong, nonatomic) NSNumber *siteID;
@property (strong, nonatomic) NSString *username;
@property (strong, nonatomic) NSString *uuid;

@end

我得到的错误是:

Error Domain=org.restkit.RestKit.ErrorDomain Code=-1011 "Expected status code in (200-299), got 400" UserInfo=0x8eadbf0 NSLocalizedRecoverySuggestion="required_parameters":"email":"string","password":"string","status":"failed","message":"Insufficient information passed. see 'required_parameters'"

基本上我的目标是获取用户/登录调用的成功响应并将其映射到 UserObject。

【问题讨论】:

您需要提供一个对象(带有关联的路由)或路径。显示一些代码。使用查尔斯查看它发送的内容。说明服务器的期望。你设置了什么序列化类型? 我在上面添加了一些希望有帮助的代码。 您可以配置restkit网络日志以获取更多详细信息:RKLogConfigureByName("RestKit/Network*", RKLogLevelTrace); 【参考方案1】:

终于弄清楚了,当然这是一个非常愚蠢的问题。服务器期待一个参数字典,但我的对象管理器的requestSerializationMIMEType 设置为RKMIMETypeJSON。因此,一旦我评论了该行,请求就可以正常工作,对象为 nil 并且参数设置为 @@"email": email, @"password": password 的字典

【讨论】:

以上是关于无法让 RestKit 0.2 发布参数的主要内容,如果未能解决你的问题,请参考以下文章

RestKit 的词法解析器问题

RestKit 0.2 映射 Core Data <--> JSON 与一对多关系

RestKit .20 RKRequestDescriptor postObject - (400-499) 中的预期状态代码,得到 200

Restkit 映射 0.2

使用 RestKit 0.2x 将文件作为单部分文档发布

Restkit 0.2 postObject 总是返回 request.body=(null)