2013-01-11 29 views
4

我正在使用RestKit,我试图发布一个查询参数(token=<token>形式的身份验证令牌)对象,但我不知道如何让它工作。下面是我在做什么...RestKit postObject与查询参数

首先,我添加请求对象映射到经理:

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]; 

当请求时,Location对象被序列化为JSON并放入请求正文。但是,不是将该令牌添加到查询字符串中,而是将其作为JSON添加到请求正文中。

例子:

request.body={"id":0,name="test","longitude":-0.1337,"latitude":51.50998,"token":"Z3JlZ2c6MTM2MDU2OTk2MDY2OTpMajkxd01acWxjcGg1dEpFVy9IaEcwNTcyMWJkSEpnTFRTQTI2eXNlN29VOVRTc1UwV1lEU0E9PQ=="} 

任何帮助,不胜感激!

+2

你有没有找到一个解决这个?我可以准确地复制你的问题。 –

+1

这是一种语义,但是如果您打算发送带有请求的授权令牌,则它可能位于授权标头中。 – barndog

回答

0

我在执行我增加了查询参数的URL本身:

RKManagedObjectRequestOperation *operation = [RKObjectManager.sharedManager appropriateObjectRequestOperationWithObject:self method:RKRequestMethodPOST path:[NSString stringWithFormat:@"/api/v1/users/3/locations?token=%@",token] parameters:nil]; 
+0

您必须添加一个带有该路径的响应描述符,以便对象管理器正确执行对象映射。 – Biclops

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); 

        } 
]; 
1

有在https://gist.github.com/onelittlefish/5970616一个要旨提供了一个很好的扩展RKObjectManager,让你查询参数添加到PUT或POST请求。

只需将这些文件放到项目中,导入标题,然后就可以使用类似于@giuseppe(将参数添加到body,而不是路径)的答案。唯一不同的是改变parametersqueryParameters - 您的通话可能会是这个样子:

[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

谢谢你解决我的问题。 +1 – bhavesh