在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求
Posted
技术标签:
【中文标题】在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求【英文标题】:RestKit object mapping request that has nested JSON in its HTTP body 【发布时间】:2013-12-04 01:01:09 【问题描述】:我在其 HTTP 正文中使用嵌套 JSON 发出 POST 请求,但没有得到适当的响应。我正在传递一个名为 RequestObject 的自定义对象,其中包含属性:
@interface RequestObject : NSObject
@property (nonatomic, copy) NSString *title;
@property (nonatomic, strong) NSDictionary *location;
@property (nonatomic, strong) NSMutableArray *pictures;
我想映射我的对象,以便在其 HTTP 正文中,JSON 看起来像这样:
"title": "Magic School Bus",
"location":
"latitude": "38.764792",
"longitude": "-121.247574"
,
"pictures": [
"base64pic": "iVBORw0KGg..."
]
对于请求对象,我是这样配置的:
RequestObject *request = [[RequestObject alloc] init];
// Title property
request.title = @"MyTitle";
// Location property
request.location = @
@"latitude" : [NSNumber numberWithDouble:38.757965],
@"longitude" : [NSNumber numberWithDouble:-121.254044]
;
// Pictures property
request.pictures = [[NSMutableArray alloc] init];
// I add a dictionary into the pictures array
NSDictionary *picture = @@"base64pic" : @"somebase64string";
[request.pictures addObject:picture];
我认为我的 request.pictures 设置可能不正确,这就是我的回复错误的原因。这是我调用 POST 请求的其余代码:
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
[mapping addAttributeMappingsFromArray:@[@"title", @"location", @"pictures"]];
[manager addRequestDescriptor:[RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[RequestObject class] rootKeyPath:nil method:RKRequestMethodPOST]];
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[NSDictionary class]];
[mapping addAttributeMappingsFromArray:@[@"response"]];
[manager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping:responseMapping method:RKRequestMethodPOST pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
// Post
[manager postObject:request path:@"books/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result)
// Response back
failure:^(RKObjectRequestOperation *operation, NSError *error)
当我在我的项目中进行 POST 调用时,我将其视为控制台中的 HTTP 请求正文:
Request Body : location[latitude]=38.757965&location[longitude]=-121.254044&pictures[][base64pic]=somebase64string&title=MyTitle
【问题讨论】:
为什么不使用请求数据创建 NSMutableURLRequest 和 setHTTPBody 并使用该请求创建 RKObjectRequestOperation。它可以让事情变得更简单直接。 我想使用 RestKit 的映射功能并学习如何解决这个问题,以便将其应用于我的其他请求。 @Ad-J 我听从了您的建议,并能够成功调用请求。我最终通过 NSMutableURLRequest “手动”完成了它,并使用 NSDictionary 设置了 HTTP 正文。我希望能够仍然使用自定义对象来设置我的值,然后将对象转换为 NSData,以便我可以将其传递给请求的 HTTP 正文。有没有办法获取一个对象,用 RestKit 映射它,然后从映射中返回一个 NSData 对象? 我把它作为一个答案。如果对您有帮助,请接受。 【参考方案1】:您的代码看起来不错。问题似乎是您没有将请求序列化类型设置为 JSON,因此您获得了表单 URL 编码的正文。
【讨论】:
嗯,我将我的经理设置为:manager.requestSerializationMIMEType = RKMIMETypeJSON;
,但我仍然没有收到正确的回复。
请求有变化吗?你和查尔斯核对过请求了吗?您是否为映射打开了跟踪日志记录?【参考方案2】:
您可以使用请求数据创建 NSMutableURLRequest 和 setHTTPBody,然后使用该请求创建 RKObjectRequestOperation。它可以让事情变得更简单直接。
对于您的下一个问题: 并非所有对象都是有效的 JSOn 对象,您只能通过请求正文传递有效的 JSON 对象,否则服务器端可能无法解密它(服务器端不会知道您的自定义对象)。
【讨论】:
以上是关于在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring REST 控制器中获取原始 JSON 正文?
REST API:请求正文为 JSON 或纯 POST 数据?
在 Postman 的请求正文中传递多个 JSON 数据并使用 Jersy(JXRS) 进入 Java Rest API