【问题标题】:RestKit mapping issue. Same Keypaths, different path patterns & request methodsRestKit 映射问题。相同的 Keypaths,不同的路径模式和请求方法
【发布时间】:2013-10-14 10:31:20
【问题描述】:

我在使用 RestKit 时遇到问题。

我将responseDescriptors 配置为将POST 请求映射到/users/logingeneralResponseMapping,并将GET 请求映射到/users/:userIDuserMapping

初始化代码:

RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:baseURL];

    ...

RKObjectMapping *generalResponseMapping = [RKObjectMapping mappingForClass:[NSMutableDictionary class]];
[generalResponseMapping addAttributeMappingsFromArray:@[ @"status", @"token" ]];

RKEntityMapping *userMapping = [RKEntityMapping mappingForEntityForName:@"User" inManagedObjectStore:managedObjectStore];
userMapping.identificationAttributes = @[ @"userID" ];
[userMapping addAttributeMappingsFromArray:@[ @"avatar", @"name", @"email" ]];


void(^configureResponse)(RKMapping *,        RKRequestMethod,        NSString *,        NSString *,        NSIndexSet *) =
                       ^(RKMapping *mapping, RKRequestMethod method, NSString *pattern, NSString *keyPath, NSIndexSet *statusCodes)
{
    RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                            method:method
                                                                                       pathPattern:pattern
                                                                                           keyPath:keyPath
                                                                                       statusCodes:statusCodes];
    [objectManager addResponseDescriptor:responseDescriptor];
};

NSIndexSet *codes = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

configureResponse(generalResponseMapping, RKRequestMethodPOST, @"users/login",   nil, codes);   
configureResponse(userMapping,            RKRequestMethodGET,  @"users/:userID", nil, codes);

    ...

但是当我尝试向 /users/login 发送 POST 请求时。

- (void)loginWithUserdata:(NSDictionary *)userdata
{   
    NSString *path = @"users/login";

    RKObjectManager *objectManager = [RKObjectManager sharedManager];
    [objectManager postObject:nil
                         path:path
                   parameters:userdata
                      success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
 {
    ...
 }
                      failure:^(RKObjectRequestOperation *operation, NSError *error)
 {
    ...
 }];
}

我收到错误,因为 RestKit 正在尝试将我的 generalResponse 对象映射到 userMapping

restkit.object_mapping:RKMapperOperation.m:231 Asked to map source object {
    status = 0;
    token = "some_fake_token";
} with mapping <RKEntityMapping:0x9bb9040 objectClass=User propertyMappings=(
    "<RKAttributeMapping: 0x9bc5980 avatar => avatar>",
    "<RKAttributeMapping: 0x9b64dc0 name => name>",
    "<RKAttributeMapping: 0x9bc5700 email => email>",
    "<RKAttributeMapping: 0x9bc6a20 id => userID>",
)>

如何在不重新排列每个请求之前的 objectManagers responseDescriptors 的情况下使用适当的映射映射来自两个路径的响应?

更新

RestKit 网络模块日志:

restkit.network:RKObjectRequestOperation.m:178 POST 'http://api.myapp.com/users/login':
request.headers={
Accept = "application/json";
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
"Content-Type" = "application/x-www-form-urlencoded; charset=utf-8";
"User-Agent" = "MyApp/666 (iPhone Simulator; iOS 7.0; Scale/2.00)";
}
request.body=email=t&password=t

如果我注释掉为users/:userID 添加的 responseDescriptor,我可以成功获得正确的映射并且网络模块将记录:

restkit.network:RKObjectRequestOperation.m:248 POST 'http://api.myapp.com/users/login' (200 OK / 1 objects) [request=0.0286s mapping=7.6855s total=7.7190s]:
response.headers={
"Cache-Control" = "max-age=0, private, must-revalidate";
Connection = "keep-alive";
"Content-Type" = "application/json; charset=utf-8";
Date = "Mon, 07 Oct 2013 23:18:06 GMT";
Etag = "\"555dbdf216a0f30229810af9411ad7c9\"";
"Keep-Alive" = "timeout=20";
Server = nginx;
Status = "200 OK";
"Transfer-Encoding" = Identity;
"X-Content-Type-Options" = nosniff;
"X-Frame-Options" = SAMEORIGIN;
"X-Request-Id" = "07803850-cfe3-4ccb-9a0d-46be980b0537";
"X-Runtime" = "0.004017";
"X-UA-Compatible" = "chrome=1";
"X-XSS-Protection" = "1; mode=block";
}
response.body={"status":0,"token":"some_fake_token"}

否则我会在 -[RKMapperOperation mapSourceRepresentationWithMappingsDictionary] 中的 @autoreleasepool 块末尾得到 EXC_BAD_ACCESS 并且网络块记录保持安静。

【问题讨论】:

    标签: ios objective-c mapping restkit restkit-0.20


    【解决方案1】:

    不确定请求类型是否应提供所需的拆分。这一行:

    NSString *path = @"/users/login";
    

    改为:

    NSString *path = @"users/login";
    

    在路径模式的一部分而不是另一部分(在响应描述符上)添加斜杠可能会导致 RestKit 尝试匹配它们时失败。

    【讨论】:

    • 无效。根据您的建议更新问题。
    • 你得到了重定向还是什么?您是否调试过实际触电并被接收回来的内容(尤其是标头)?
    • 感谢您的关注。更新了 RestKit 网络模块日志记录部分的问题。
    • RKResponseDescriptor 有许多 'matches...' 方法,我会看看调试这些方法,看看会发生什么。两种模式都应该匹配,但方法类型应该区分描述符。
    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    相关资源
    最近更新 更多