使用 RestKit 发出 POST 请求

Posted

技术标签:

【中文标题】使用 RestKit 发出 POST 请求【英文标题】:Make a POST request using RestKit 【发布时间】:2013-12-30 02:09:11 【问题描述】:

我想,我使用 RKObjectManager 使用 postObject 方法。请求的主体是一个整数数组,JSON 表示类似于 [2348, 9864, 3645]。我添加了一个 RKResponseMapping 来响应服务并且工作正常,但是在服务端总是一个数组为空。什么是 RKRequestMapping 然后我必须添加?我错过了什么?

我的代码如下:

- (void) sendPOSTRequest:(NSArray*) postBody
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:baseUrl]];

RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[RKJSONArrayResponse class]];

[responseMapping addAttributeMappingsFromDictionary:@ @"Code" : @"code",
                                                       @"Success":@"success",
                                                       @"Content":@"content",
                                                       @"Error": @"error"];

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
                                                                                method:RKRequestMethodPOST
                                                                           pathPattern:@"/api/Requisitions/SendReport"
                                                                               keyPath:nil
                                                                           statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

RKObjectMapping *requestMapping = [RKObjectMapping mappingForClass:[NSArray class]];

RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping
                                                                               objectClass:[NSArray class]
                                                                                rootKeyPath:nil,
                                                                                    method:RKRequestMethodPOST];

[manager addRequestDescriptor:requestDescriptor];

[manager addResponseDescriptor:responseDescriptor];

[self.manager postObject:postBody
                    path:@"/api/Requisitions/SendReport"
              parameters:nil
                 success:success
                 failure:failure];


服务代码是用 C# 和 Web Api 编写的,在这里您将始终收到变量“report”为空。:

public JsonResponse<int[]> SendReport(int[] report)

【问题讨论】:

您在哪里设置映射?您可以发布该代码吗?您需要为该 NSArray 设置序列化映射,然后将 NSArrays 路由到 /send 的关键路径。最好您创建自己的类来容纳整数数组,这样您就不会映射 gan NSArray 本身,而是映射类。 您是否创建了任何请求映射?显示您的代码。检查使用 Charles(或类似工具)发送的内容。 这正是我想知道的,然后我应该指定正确的 RKRequestDescriptor 实例。我使用 Wireshark 检查了 HTTP 请求,但标头 Content-Type 缺失且 Content-Length 为零。感谢您的帮助。 @Wain 我只是更新了一个代码。我还没有为 NSArray 声明 RKRequestDescriptor。 嗨,@valheru 我会尝试用我自己的类包装一个 NSNumber 的 NSArray。但是,我不能用 NSArray 和 NSNumber 声明 RKObjectMapping 的实例? 【参考方案1】:

你有两种方法可以解决这个问题:

如果你想把它做好,你需要为你的整数值数组创建RKObjectMapping,然后你需要创建RKRequestDescriptor,它将使用你新创建的RKObjectMapping '将使用方法– addRequestDescriptor: 将此RKRequestDescriptor 添加到您的RKObjectManager。这将使 RestKit 根据您的 RKObjectMapping 将您传递给 postObject 方法的对象转换为 JSON

我不推荐这种方式。但是,如果您只是想尝试一下,看看您可以用最少的努力做什么,您应该将整数数组作为 parameters 参数传递,如下所示:

NSArray *body = @[ @1234, @7475, @4432 ];

[manager postObject:nil path:@"/send" 参数:body ...]

请注意,参数参数是NSDictionary,但如果您传递NSArray,它将起作用并触发警告。 同样,花时间熟悉RKRequestDescriptorRKObjectMapping

如果您想了解有关最佳 RestKit 设置以及如何使用少量 ObjectManager 构建可维护应用的更多信息。

【讨论】:

我尝试了第二种方法,但不适合我。我知道我应该指定 RKRequestDescriptor,但不知道如何为 NSArray 类声明 RKObjectMapping 的实例。 @Joseph: RKObjectMapping* mapping = [RKObjectMapping mappingForClass:[NSArray class]]; 作为对任何来此答案的人的仅供参考,该链接现在会导致垃圾邮件。【参考方案2】:

你想要的 JSON 实在是太简单了。 RestKit 希望最好发送一个字典,其中包含一个键和一个整数数组的值。在您的情况下,最简单的做法是直接将 NSJSONSerialization 与数组一起使用,然后将 JSON 添加到请求中并使用 objectRequestOperationWithRequest:success:failure: 并将操作入队。

【讨论】:

我解决了我的问题,将整数数组封装到一个对象中,该对象有两个要检查的属性,并为这个类声明一个 RKRequestDescriptor。 @Joseph 你能解释一下你是怎么做到的吗?例如,您创建了一个具有属性数组的对象。你是如何在 RKRequestDescriptor 中映射它的?

以上是关于使用 RestKit 发出 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何向外部 Rest Api 发出 Http Post 请求? [关闭]

如何在 reactjs 中向 nodejs RESTful API 发出 POST 请求

使用 RESTKit 做一个简单的 json POST

在事务中从 WCF 服务向 REST API 发出 Post 请求

尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误

在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求