使用查询参数的RestKit postObject

4
我正在使用RestKit并尝试提交一个带有查询参数的对象(形式为token=<token>中的身份验证令牌),但我无法弄清如何使其正常工作。这是我的操作步骤...
首先,我将请求对象映射添加到管理器中:
RKObjectMapping *requestMapping = [RKObjectMapping requestMapping];
    [requestMapping addAttributeMappingsFromDictionary:@{
     @"id" : @"id",
     @"name"   : @"name",
     @"latitude" : @"latitude",
     @"longitude" : @"longitude"
     }];

    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:requestMapping objectClass:[Location class] rootKeyPath:nil];

    [manager addRequestDescriptor:requestDescriptor];

然后我发出请求:
RKManagedObjectRequestOperation *operation = [RKObjectManager.sharedManager  appropriateObjectRequestOperationWithObject:self method:RKRequestMethodPOST path:@"/api/v1/users/3/locations" parameters:@{@"token" : token}];

[operation setCompletionBlockWithSuccess:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
    Location * location = (Location*)mappingResult;
    self.id = Location.id;
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
    ALog(@"fail!");
    }];

[RKObjectManager.sharedManager enqueueObjectRequestOperation:operation];

当请求被发出时,位置对象会被序列化为JSON,并被放置在请求体中。然而,令牌并没有被添加到查询字符串中,而是以JSON格式被添加到请求体中。
示例:
request.body={"id":0,name="test","longitude":-0.1337,"latitude":51.50998,"token":"Z3JlZ2c6MTM2MDU2OTk2MDY2OTpMajkxd01acWxjcGg1dEpFVy9IaEcwNTcyMWJkSEpnTFRTQTI2eXNlN29VOVRTc1UwV1lEU0E9PQ=="}

非常感谢您的帮助!


2
你有没有找到解决办法?我可以完全复制你的问题。 - Aran Mulholland
1
这有点像语义学,但如果您要发送请求的授权令牌,最好将其放在Authorization标头中。 - barndog
3个回答

1

这里有一个Gist https://gist.github.com/onelittlefish/5970616,提供了一个很好的扩展RKObjectManager的方法,可以让你向PUT或POST请求中添加查询参数。

只需将这些文件放入您的项目中,导入头文件,然后您就可以使用类似于@giuseppe的答案(将参数添加到正文而不是路径)。唯一的区别是将parameters更改为queryParameters - 您的调用可能看起来像这样:

[objectManager postObject:self
                     path:@"/api/v1/users/3/locations"
          queryParameters:queryParams
                  success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

                  Location * location = (Location*)mappingResult;
                  self.id = Location.id;

              }
              failure:^(RKObjectRequestOperation *operation, NSError *error) {

                  ALog(@"fail!");

              }
];

0
在我的实现中,我已经将查询参数直接添加到URL中:
RKManagedObjectRequestOperation *operation = [RKObjectManager.sharedManager  appropriateObjectRequestOperationWithObject:self method:RKRequestMethodPOST path:[NSString stringWithFormat:@"/api/v1/users/3/locations?token=%@",token] parameters:nil];

你需要为该路径添加一个响应描述符,以便对象管理器能够正确执行对象映射。 - Yogurt

0

只需阅读网上提供的许多教程就可以了解编程的基础知识。 然而:

NSDictionary *queryParams;
    queryParams = [NSDictionary dictionaryWithObjectsAndKeys:
                   token, @"token",nil];

RKResponseDescriptor *tokenResponseDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:loginMapping
                                        pathPattern:nil
                                            keyPath:@"yourpathtoyoyrkey"
                                        statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];

[objectManager addResponseDescriptor:tokenResponseDescriptor];
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

    [objectManager postObject:loginMapping
                     path:@"yourmethod.json"
               parameters:queryParams
                  success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {


                  }
                  failure:^(RKObjectRequestOperation *operation, NSError *error) {

                      //NSLog(@"Error WS RK:%@",error.localizedDescription);

                  }
 ];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接