Ios RESTKit:删除具有主体参数的对象

Ios RESTKit:删除具有主体参数的对象,ios,restkit,restkit-0.20,Ios,Restkit,Restkit 0.20,RESTKit 0.20.x 我需要发送以下删除请求: 网址: 正文:{@“inviteId”:“1234”} 在尝试构建该请求时,下面是我使用的代码: AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; self.objectManager = [self getObjectManager]; self.objectManager.managedObjectStore =

RESTKit 0.20.x

我需要发送以下删除请求:

网址:

正文:{@“inviteId”:“1234”}

在尝试构建该请求时,下面是我使用的代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.objectManager = [self getObjectManager];
self.objectManager.managedObjectStore = appDelegate.managedObjectStore;

RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[InviteDelete class]];


RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[mapping inverseMapping] objectClass:[NSMutableDictionary class] rootKeyPath:nil method:RKRequestMethodDELETE];

NSIndexSet *statusCodeSet = RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful);

RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:mapping
                                                                                        method:RKRequestMethodAny
                                                                                   pathPattern:@"/invites"
                                                                                       keyPath:nil
                                                                                   statusCodes:statusCodeSet];

self.objectManager.requestSerializationMIMEType = RKMIMETypeJSON;
[self.objectManager addRequestDescriptor:requestDescriptor];
[self.objectManager addResponseDescriptor:responseDescriptor];

[self.objectManager.HTTPClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];


InviteDelete *objectToDelete = [[InviteDelete alloc]init];
objectToDelete.inviteId = [NSNumber numberWithInt:294];

[self.objectManager deleteObject:objectToDelete path:@"/invites" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

} failure:^(RKObjectRequestOperation *operation, NSError *error) {
}];
Charles日志显示正在发送的以下请求(原始):

我知道嵌入URL时创建
DELETE
更容易,我只需将
parameters
添加到
objectManager
。我希望我有这个选择!我必须创建一个带有主体参数的请求,以
删除

要求:如何创建一个简单的JSON
DELETE
请求,其正文中包含以下内容

{@“inviteId”:“1234”}


可选:RESTKit还可以在成功后删除本地对象

您的请求描述符是错误的,因为您使用了
objectClass:[NSMutableDictionary类]
,因此它仅在您尝试删除
NSMutableDictionary
实例时适用。您应该使用:

... objectClass:[InviteDelete class] ...

RestKit没有内置的方法来理解响应并自动删除源对象,因此您需要验证响应内容,然后在
成功
回调块中执行并保存删除操作。

您不能通过对象映射获得删除请求的正文。 RESTAPI设计支持 标准也是如此

Rest工具包不支持对象映射,但它确实允许您创建自定义请求和操作

NSDictionary *params = YOUR_JSON_BODY

NSMutableURLRequest *request = [self requestWithPathForRouteNamed:path
                                                           object:objectToDelete
                                                       parameters:nil];
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:params options:NSJSONReadingMutableLeaves error:nil]];
[request setHTTPMethod:@"DELETE"];
RKObjectRequestOperation *operation = [self objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
   if (success) ...
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    if (failure) failure(error);
}];

[self enqueueObjectRequestOperation:operation];

还有这个谢谢。我将其更改为objectClass,改为[InviteDelete class],原始请求似乎是相同的。请参阅我链接的另一个答案,我认为如果不编辑RestKit代码,您就无法完成此操作(我编写此答案时忘记了这一点)。修补RestKit以检查
方法上的精确匹配,如果是显式请求,则执行映射(然后提出拉请求)…这可能是一个好方法。如何使用主体发出删除请求?我应该使用NSURL连接吗?你可以。或者创建一个请求,然后使用
objectRequestOperationWithRequest:success:failure:
。您可以使用
RKMappingOperation
创建JSON主体。或者您可以请求端点更改为
/invite/:id
NSDictionary *params = YOUR_JSON_BODY

NSMutableURLRequest *request = [self requestWithPathForRouteNamed:path
                                                           object:objectToDelete
                                                       parameters:nil];
[request setHTTPBody:[NSJSONSerialization dataWithJSONObject:params options:NSJSONReadingMutableLeaves error:nil]];
[request setHTTPMethod:@"DELETE"];
RKObjectRequestOperation *operation = [self objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
{
   if (success) ...
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    if (failure) failure(error);
}];

[self enqueueObjectRequestOperation:operation];