在 POST JSON RestKit 中检索 null

Posted

技术标签:

【中文标题】在 POST JSON RestKit 中检索 null【英文标题】:Retrived null in POST JSON RestKit 【发布时间】:2013-12-16 15:15:36 【问题描述】:

我使用过 RestKit 并与托管对象进行了映射。然后我使用postObject 方法,但在检索主体时遇到问题,因为它映射为空。

 RKObjectManager  *objectManager = [RKObjectManager managerWithBaseURL:baseURL];

// Serialize to JSON
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

[RKObjectManager setSharedManager:objectManager];

RKEntityMapping *searchInfoMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Search class]) inManagedObjectStore: objectManager.managedObjectStore];
searchInfoMapping.identificationAttributes = @[ @"faresQueryType" ];

[searchInfoMapping addAttributeMappingsFromDictionary:@
    @"id" : @"ID",
    @"type" : @"Type",
    @"count" : @"Count",
    @"route” : @"route”,
];

RKObjectMapping     *searchInfoRequestMapping =[RKObjectMapping requestMapping];
[searchInfoRequestMapping addAttributeMappingsFromDictionary:@
    @"id" : @"ID",
    @"type" : @"Type",
    @"count" : @"Count",
    @"route” : @"route”,
];

//Data mapping is a method that returns an RKObjectMapping for my model
RKResponseDescriptor * searchDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:searchInfoMapping pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[objectManager addResponseDescriptorsFromArray:@[searchDescriptor,]];

//Inverse mapping, to perform a POST

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:searchInfoRequestMapping  objectClass:[Search class] rootKeyPath:nil];
[objectManager addRequestDescriptor:requestDescriptor];


[appDelegate.objectManager postObject:nil path:@"routes" parameters:postParameters success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
            NSLog(@"Success case %@",mappingResult);
         failure:^(RKObjectRequestOperation *operation, NSError *error) 
            NSLog(@"Failure in Flight Mapping %@",error);
            [alert show];
        ];

编辑

      //JSON Result 

    
    "currency": 
        "code": "USD",
        "name": "U.S. Dollar",
        "symbol": "US$",
        "exchange_rate": 1
    ,
    "routes": [
        
            "id": "MS648-2022:MS985-2110",
            "fares": [
                
                    "price": 745.32,
                    "description": "Economy",
                    "deeplink": "http://www.wego.com/flights/providers/2/deeplinks?search_id=CQtxCXQCRfmwhp72PAjopQ&trip_id=RUH:NYC:2013-12-20&fare_id=sky-tours.com:0&route=RUH-JFK",
                    "provider_code": "sky-tours.com",
                    "deeplink_params": 
                        "trip_id": "RUH:NYC:2013-12-20",
                        "route": "RUH-JFK",
                        "search_id": "CQtxCXQCRfmwhp72PAjopQ",
                        "fare_id": "sky-tours.com:0"
                    
                
            ]
        
    ]

【问题讨论】:

给出发送和接收的 JSON 的更多细节。 searchInfoMapping 似乎与结果 JSON 没有可比性。 Search 对象应该如何与返回的 JSON 相关联?我希望搜索对象与 JSON 中的 routes 信息有关系... 我在根值之前得到了你,但现在我需要检索“路线”,只需考虑“搜索”是“路线”。 Search 是要发布的单个对象,因此 RestKit 想要将 POST 映射回该单个对象。类似于该对象的整体细节,然后将routes 纳入关系。你能这样工作吗? 你有在 RestKit JSON 中使用 POST 和 CoreData 的好例子吗? 【参考方案1】:

当您调用postObject(当前您有postObject:nil)时,您需要提供Search 对象而不是nil。这告诉 RestKit 使用哪个请求映射来发送请求。由于未设置它,服务器可能不会拥有所有必需的信息(无法通过提供的信息来判断)。

【讨论】:

但是我在 viewcontroller 中调用 postObject 方法并在 appDelegation 中调用映射 从哪里调用它并不重要。您是否有应该传递的 Search 实例?您期望发送和接收什么?什么是postParameters 是的,我在 CoreData 托管对象中有 Search 实例,并且 postParameters 是 NsMutableDictionary。我现在在不使用 coreData 和映射的情况下进行了测试,它工作正常。但是当我使用上述代码映射时,有时会检索数据,有时未检索到关系数据 我认为您应该为faresQueryType 添加一个映射 - 并显示您发送和接收的详细信息... 您能帮我提供完整的示例 RestKit JSON POST 数据以及映射、响应和请求描述符吗?

以上是关于在 POST JSON RestKit 中检索 null的主要内容,如果未能解决你的问题,请参考以下文章

使用 RestKit 发送 POST 不会返回 JSON 内容

使用 RESTKit 做一个简单的 json POST

Post Json Restkit 无法为 HTTP 方法“POST”类型的对象找到可路由路径

使用 RestKit 在 post 请求中寻求帮助

RestKit POST 发送 JSON 不包含映射路径/类名

使用 RestKit 将大对象作为 JSON 发布