在其 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 对象映射请求的主要内容,如果未能解决你的问题,请参考以下文章

如何从 REST API 访问嵌套的 json?

REST 查询的响应正文中缺少 JSON 数据

如何在 Spring REST 控制器中获取原始 JSON 正文?

REST API:请求正文为 JSON 或纯 POST 数据?

在 Postman 的请求正文中传递多个 JSON 数据并使用 Jersy(JXRS) 进入 Java Rest API

通过 rest 调用将 json 作为查询正文发送