使用 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
,它将起作用并触发警告。
同样,花时间熟悉RKRequestDescriptor
和RKObjectMapping
。
如果您想了解有关最佳 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 请求
在事务中从 WCF 服务向 REST API 发出 Post 请求
尝试在 https://api.thetvdb.com/ 向 TVDB REST API 发出 JSON POST 请求,但出现 CORS 错误