Post object error in RestKit - ios

I'm posting object with below code
Models
#interface Event : NSManagedObject
#property (nonatomic, retain) NSString * eventID;
#property (nonatomic, retain) NSString * title;
#property (nonatomic, retain) Calendar *calendar; // many-to-one
#interface Calendar : NSManagedObject
#property (nonatomic, retain) NSString * calendarID;
#property (nonatomic, retain) NSSet *events; // one-to-many
RKRequestDescriptor
RKObjectMapping *calendarRequestMapping = [RKObjectMapping requestMapping];
[calendarRequestMapping addAttributeMappingsFromDictionary:#{
#"calendarID":#"calendar"}];
RKObjectMapping *postRequestMapping = [RKObjectMapping requestMapping];
[postRequestMapping addAttributeMappingsFromArray:#[ #"title"]];
[postRequestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"calendar" toKeyPath:#"calendar" withMapping:calendarRequestMapping]];
RKRequestDescriptor * eventRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:postRequestMapping objectClass:[Event class] rootKeyPath:nil method:RKRequestMethodPOST];
[objectManager addRequestDescriptor:eventRequestDescriptor];
POST
[[RKObjectManager sharedManager] postObject:event path:#"/events/" parameters:nil success:nil failure:nil];
According to the server log, What I posted is
{u'calendar[calendar]': [u'3b60a22c-d46e-46ca-b978-ec81a8b47fcb'], u'title': [u'xxxxx']}
What I expect is
{u'calendar': [u'3b60a22c-d46e-46ca-b978-ec81a8b47fcb'], u'title': [u'xxxxx']}
I have tried
[calendarRequestMapping addAttributeMappingsFromDictionary:#{
#"calendarID":nil}];
Or
[postRequestMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"calendar" toKeyPath:nil withMapping:calendarRequestMapping]];
Both of them will throw an exception.

I just fixed this issue with below mapping
RKObjectMapping *eventRequestMapping = [RKObjectMapping requestMapping];
[eventRequestMapping addAttributeMappingsFromDictionary:#{
#"title":#"title",
#"calendar.calendarID":#"calendar"}];

Related

Restkit use object mapping without request

Is any way to use Restkit framework to map json (nsdictionary) to object without request.
i have json and need to map it in object
You can use RKMappingOperation class. This is example from documentation:
#interface RKMetadataExample : NSObject
#property (nonatomic, copy) NSString *name;
#property (nonatomic, copy) NSURL *URL;
#property (nonatomic, copy) NSDate *mappedAt;
#end
RKMetadataExample *example = [RKMetadataExample new];
NSDictionary *representation = #{ #"name": #"Blake Watters" };
NSDictionary *metadata = #{ #"URL": [NSURL URLWithString:#"http://restkit.org"] };
RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[RKMetadataExample class]];
[objectMapping addAttributeMappingsFromDictionary:#{ #"name": #"name", #"#metadata.URL": #"URL" }];
RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:representation destinationObject:example mapping:objectMapping];
mappingOperation.metadata = metadata;
NSError *error = nil;
BOOL success = [mappingOperation execute:&error];

RestKit mapping with NSDictionary and NSArray object

{"coord":{"lon":72.62,"lat":23.03},"weather":[{"id":500,"main":"Rain","description":"light rain","icon":"10n"}],"base":"stations","main":{"temp":303.082,"pressure":1014.85,"humidity":66,"temp_min":303.082,"temp_max":303.082,"sea_level":1018.46,"grnd_level":1014.85},"wind":{"speed":1.07,"deg":340.501},"rain":{"3h":0.435},"clouds":{"all":76},"dt":1475333911,"sys":{"message":0.0033,"country":"IN","sunrise":1475283682,"sunset":1475326567},"id":1279233,"name":"Ahmadabad","cod":200}
Above is my API response.
Now I want to mapping of "weather" and "name" and want the same object as a response.
I can create to class
#interface WeatherStatus : NSObject
#property (nonatomic, copy) NSString *name;
#property (nonatomic, strong) WeatherInfo *info;
#end
and
#interface WeatherInfo : NSObject
#property (nonatomic, copy) NSString *description;
#property (nonatomic, copy) NSString *icon;
Below is mapping code.
RKObjectMapping *weatherInfo = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[weatherInfo addAttributeMappingsFromDictionary:#{#"description": #"description", #"icon": #"icon"}];
RKObjectMapping *weatherStatus = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[weatherStatus addAttributeMappingsFromArray:#[#"name"]];
[weatherStatus addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:#"weather" toKeyPath:#"weather" withMapping:weatherInfo]];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:weatherStatus method:RKRequestMethodGET pathPattern:nil keyPath:#"weather" statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:kAPP_KEY, #"appid", #"Ahmedabad", #"q", nil];
[[RKObjectManager sharedManager] getObjectsAtPath:#"/data/2.5/weather" parameters:queryParams success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
WeatherStatus *obj = [mappingResult.array objectAtIndex:0];
NSLog(#"info %#",obj.info);
NSLog(#"name %#",obj.name);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(#"What do you mean by 'there is no coffee?': %#", error);
}];
I am getting
info (null)
name (null)
Can anyone let me know where is the mistake?
I have already seen RestKit complex and simple JSON RKObjectMapping almost working, but
Don't use description as a property name, it'll only cause you problems. Use overview or something similar instead.
In the JSON, the weather is an array, so you should make your weather (info) property a NSArray, and be sure the name in the mapping and the property match.
I change the property of info object in "WeatherStatus" class to NSArray.
#property (nonatomic, copy) NSString *name;
#property (nonatomic, strong) NSArray *weather;
Here is the modification of mapping code.
RKObjectMapping *venueMapping = [RKObjectMapping mappingForClass:[WeatherStatus class]];
[venueMapping addAttributeMappingsFromDictionary:#{#"name": #"name"}];
RKObjectMapping *locationMapping = [RKObjectMapping mappingForClass:[WeatherInfo class]];
[locationMapping addAttributeMappingsFromDictionary:#{#"description": #"description",#"icon":#"icon"}];
[venueMapping addRelationshipMappingWithSourceKeyPath:#"weather" mapping:locationMapping];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:venueMapping method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:nil];
[objectManager addResponseDescriptor:responseDescriptor];
Add relationship mapping with WeatherStatus class.
Credit goes to https://stackoverflow.com/users/1988185/wain

RESTful service response isn't mapping to an object - RESTKit

I have a JSON response from REST service I am using RESTKit and its not getting mapped , below is the source for the same
RKObjectMapping *userMapping = [RKObjectMapping requestMapping];
[userMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:#"strCode" toKeyPath:#"UserCode"]];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:userMapping
objectClass:[User class]
rootKeyPath:nil method:RKRequestMethodPOST];
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[User class]];
[responseMapping addAttributeMappingsFromDictionary:#{ #"Id":#"Id",#"UserCode":#"strCode",#"FirstName": #"strFname", #"LastName": #"strLname",#"Email":#"strEmail",#"PhoneNumber":#"strPhoneNumber",#"CompanyName":#"strCompany",#"Address":#"strAddress",#"Abn":#"strAbn"}];
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:responseMapping
method:RKRequestMethodAny
pathPattern:nil
keyPath:nil
statusCodes:[NSIndexSet indexSetWithIndex:200]];
RKObjectManager *manager = [RKObjectManager sharedManager];
[manager addRequestDescriptor:requestDescriptor];
[manager addResponseDescriptor:responseDescriptor];
RKObjectMapping *errResponseMapping = [RKObjectMapping mappingForClass:[ServiceError class]];
[errResponseMapping addAttributeMappingsFromDictionary:#{ #"ErrorMessage": #"strErrorMessage", #"FriendlyMessage": #"strFriendlyMessage"}];
RKResponseDescriptor *errResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:errResponseMapping
method:RKRequestMethodAny
pathPattern:nil
keyPath:nil
statusCodes:[NSIndexSet indexSetWithIndex:200]];
[manager addResponseDescriptor:errResponseDescriptor];
manager.requestSerializationMIMEType = RKMIMETypeJSON;
User *user = [user new];
user.strCode = txtCode.text;
// POST the parameterized representation of the `page` object to `/posts` and map the response
[manager postObject:user path:[ServiceUrls userDetails] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *result) {
NSlog(#"%d",result.count);
}
} failure:nil];
The user class looks like this
#interface User : NSObject
{
}
#property (nonatomic,retain) NSNumber *Id;
#property (nonatomic,retain) NSString *strCode;
#property (nonatomic,retain) NSString *strFname;
#property (nonatomic,retain) NSString *strLname;
#property (nonatomic,retain) NSString *strEmail;
#property (nonatomic,retain) NSString *strPhoneNum;
#property (nonatomic,retain) NSString *strCompany;
#property (nonatomic,retain) NSString *strAddress;
#property (nonatomic,retain) NSString *strAbn;
#end
JSON response that i get but isn't mapping is as follows
{"Id":7,
"UserCode":"CC1234",
"FirstName":"Test name_",
"LastName":"Banga",
"Email":"p#b.com",
"PhoneNumber":"0421196587",
"CompanyName":"String",
"Address":"String",
"Abn":"String"}
Not sure whats wrong with the code I have added, any clue ?
Maybe try this.
Mapping:
-(void) getUserMapping {
RKEntityMapping *userEntityMapping = [self generateEntityMappingFromClass:[User class]];
userEntityMapping.identificationAttributes = #[#"Id"];
return userEntityMapping;
}
Generate Mapping:
+ (RKEntityMapping *)generateEntityMappingFromClass:(Class)objectClass {
NSAssert(objectClass != NULL, #"Cannot generate a mapping from a null object class.");
NSDictionary *propertiesAndClasses = [[RKPropertyInspector sharedInspector] propertyInspectionForClass:objectClass];
NSAssert([propertiesAndClasses count] > 0, #"Cannot generate a mapping from a class containing zero properties.");
RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass(objectClass) inManagedObjectStore: [RKManagedObjectStore defaultStore]];
NSMutableDictionary *mappingDictionary = [[NSMutableDictionary alloc] init];
for (NSString *property in [propertiesAndClasses allKeys]) {
NSLog(#"property: %#", property);
[mappingDictionary setObject:property forKey:property];
}
[mapping addAttributeMappingsFromDictionary:mappingDictionary];
return mapping;
}
Response descriptor:
RKResponseDescriptor *responseDescriptorBody = [RKResponseDescriptor responseDescriptorWithMapping:[self getUserMapping] method:RKRequestMethodGET pathPattern:#"" keyPath:#"" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
I think your problem is JSON without keyPath, try to change it from nil to #""

RestKit mapping the wrong object

I'm using RestKit and this is how I initialize it and add routes and descriptors:
- (void)initRestClient
{
NSURL *baseURL = [NSURL URLWithString:kSomeBaseURL];
self.manager = [RKObjectManager managerWithBaseURL:baseURL];
[self.manager setRequestSerializationMIMEType:RKMIMETypeJSON];
[self.manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
[self.manager addResponseDescriptorsFromArray:[RKObjectManager sharedManager].responseDescriptors];
[self.manager addRequestDescriptorsFromArray:[RKObjectManager sharedManager].requestDescriptors];
[self.manager.HTTPClient.operationQueue setMaxConcurrentOperationCount:5];
[RKObjectManager setSharedManager:self.manager];
// AFHTTPClient *client = [RKObjectManager sharedManager].HTTPClient;
[self initRoutes];
[self initMappingObjectsAndDiscriptors];
}
- (void)initRoutes
{
RKRoute *bannersRoute = [RKRoute routeWithClass:[RKBanner class] pathPattern:#"Banners?categoryID=:categoryID" method:RKRequestMethodGET];
bannersRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:bannersRoute];
RKRoute *branchesRoute = [RKRoute routeWithClass:[RKBranches class] pathPattern:#"Branches?city=:city&type=:type" method:RKRequestMethodGET];
branchesRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:branchesRoute];
RKRoute *shortTokenRoute = [RKRoute routeWithClass:[RKShortToken class] pathPattern:#"users/login/quick/shortToken?phone=:phone&extraCode=:extraCode" method:RKRequestMethodGET];
shortTokenRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:shortTokenRoute];
RKRoute *longTokenRoute = [RKRoute routeWithClass:[RKLongToken class] pathPattern:#"users/login/quick/userDetails?shortToken=:shortToken" method:RKRequestMethodGET];
longTokenRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:longTokenRoute];
}
- (void)initMappingObjectsAndDiscriptors
{
RKObjectMapping *bannerMapping = [RKObjectMapping mappingForClass:[RKBanner class]];
[bannerMapping addAttributeMappingsFromDictionary:[RKBanner getAttributes]];
RKResponseDescriptor *bannerDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:bannerMapping method:RKRequestMethodAny pathPattern:nil keyPath:#"Banners" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
RKObjectMapping *branchesMapping = [RKObjectMapping mappingForClass:[RKBranches class]];
[branchesMapping addAttributeMappingsFromDictionary:[RKBranches getAttributes]];
RKResponseDescriptor *branchesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:branchesMapping method:RKRequestMethodGET pathPattern:nil keyPath:#"Branches" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
RKObjectMapping *shortTokenMapping = [RKObjectMapping mappingForClass:[RKShortToken class]];
[shortTokenMapping addAttributeMappingsFromDictionary:[RKShortToken getAttributes]];
RKResponseDescriptor *shortTokenDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:shortTokenMapping method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
RKObjectMapping *longTokenMapping = [RKObjectMapping mappingForClass:[RKLongToken class]];
[longTokenMapping addAttributeMappingsFromDictionary:[RKLongToken getAttributes]];
// longTokenMapping.setDefaultValueForMissingAttributes = YES;
// longTokenMapping.setNilForMissingRelationships = YES;
RKResponseDescriptor *longTokenDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:longTokenMapping method:RKRequestMethodGET pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[self.manager addResponseDescriptorsFromArray:#[bannerDescriptor, branchesDescriptor, shortTokenDescriptor, longTokenDescriptor]];
}
This is how each one of the classes is build:
#interface RKBanner : NSObject
#property (strong, nonatomic) NSNumber *idNum;
#property (strong, nonatomic) NSString *name;
#property (strong, nonatomic) NSString *addressURL;
#property (strong, nonatomic) NSString *bannerPosition;
#property (strong, nonatomic) NSString *imageALT;
#property (strong, nonatomic) NSNumber *imageHeight;
#property (strong, nonatomic) NSString *imageURL;
#property (strong, nonatomic) NSNumber *imageWidth;
#property (strong, nonatomic) NSString *subtitle;
#property (strong, nonatomic) NSString *targetURL;
#property (strong, nonatomic) NSString *textURL;
#property (strong, nonatomic) NSString *title;
+ (NSDictionary*)getAttributes;
#end
#implementation RKBanner
+ (NSDictionary*)getAttributes
{
return [NSDictionary dictionaryWithObjects:#[#"idNum", #"name", #"addressURL", #"bannerPosition", #"imageALT", #"imageHeight",
#"imageURL", #"imageWidth", #"subtitle", #"targetURL", #"textURL", #"title"]
forKeys:#[#"ID", #"Name", #"AddressURL", #"BannerPosition", #"ImageALT", #"ImageHeight",
#"ImageURL", #"ImageWidth", #"SubTitle", #"TargetURL", #"TextURL", #"Title"]];
}
#end
#interface RKBranches : NSObject
#property (strong, nonatomic) NSNumber *idNum;
#property (strong, nonatomic) NSString *branchTitle;
#property (strong, nonatomic) NSString *address;
#property (strong, nonatomic) NSNumber *branchType;
#property (strong, nonatomic) NSString *city;
#property (strong, nonatomic) NSString *fax;
#property (assign, nonatomic) BOOL isCanOrder;
#property (assign, nonatomic) BOOL isMe;
#property (strong, nonatomic) NSString *openHours;
#property (strong, nonatomic) NSString *orderCode;
#property (strong, nonatomic) NSString *phone;
#property (strong, nonatomic) NSString *remarks;
+ (NSDictionary*)getAttributes;
#end
#implementation RKBranches
+ (NSDictionary*)getAttributes
{
return [NSDictionary dictionaryWithObjects:#[#"idNum", #"branchTitle", #"address", #"branchType", #"city", #"fax",
#"isCanOrder", #"isMe", #"openHours", #"orderCode", #"phone", #"remarks"]
forKeys:#[#"ID", #"Name", #"Address", #"BranchType", #"City", #"Fax",
#"IsCanOrder", #"IsMe", #"OpenHours", #"OrderCode", #"Phone", #"Remarks"]];
}
#end
#interface RKShortToken : NSObject
#property (strong, nonatomic) NSString *responseError;
#property (strong, nonatomic) NSString *shortToken;
+ (NSDictionary*)getAttributes;
#end
#implementation RKShortToken
+ (NSDictionary*)getAttributes
{
return [NSDictionary dictionaryWithObjects:#[#"responseError", #"shortToken"]
forKeys:#[#"responseError", #"shortToken"]];
}
#end
#interface RKLongToken : NSObject
#property (strong, nonatomic) NSString *responseError;
#property (strong, nonatomic) NSString *responseMessage;
#property (strong, nonatomic) NSString *responseHttpCode;
#property (strong, nonatomic) NSString *responseUserMessage;
#property (strong, nonatomic) NSString *abroadInd;
#property (strong, nonatomic) NSString *accountType;
#property (strong, nonatomic) NSString *customerID;
#property (strong, nonatomic) NSString *longToken;
+ (NSDictionary*)getAttributes;
#end
#implementation RKLongToken
+ (NSDictionary*)getAttributes
{
return [NSDictionary dictionaryWithObjects:#[#"responseError", #"responseMessage", #"responseHttpCode", #"responseUserMessage",
#"abroadInd", #"accountType", #"customerID", #"longToken"]
forKeys:#[#"responseError", #"responseError.DeveloperMessage", #"responseError.HttpCode", #"responseError.UserMessage",
#"abroadInd", #"accountType", #"customerId", #"longToken"]];
}
#end
Than when I try to call RKShortToken, I get a good response, but the object that I get is RKLongToken:
- (void)quickLoginWithTelephone:(NSString*)telephone extraCode:(NSString *)extraCode completionBlock:(quickLoginExtraCodeCompletionBlock)success
{
NSDictionary *params = #{ #"phone" : telephone, #"extraCode" : extraCode };
[[RKObjectManager sharedManager] getObjectsAtPath:#"users/login/quick/shortToken?"
parameters:params
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(#"%#", operation.HTTPRequestOperation.responseString);
NSLog(#"%#", mappingResult.array);
success(YES);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(#"Error occurred.");
}];
}
Here is the logs:
2014-01-06 15:46:01.428 Online[8796:60b] I restkit.network:RKObjectRequestOperation.m:180 GET 'http://10.174.10.35/service/service.svc/users/login/quick/shortToken?&extraCode=null&phone=0505717596'
2014-01-06 15:50:03.999 Online[8796:60b] {"responseError":null,"shortToken":"I55933325601458654742"}
2014-01-06 15:46:01.577 Online[8796:60b] (
"<RKLongToken: 0x14dd3a50>"
)
2014-01-06 15:46:04.490 Online[8796:1403] I restkit.network:RKObjectRequestOperation.m:250 GET 'http://10.174.10.35/service/service.svc/users/login/quick/shortToken?&extraCode=null&phone=0505717596' (200 OK / 1 objects) [request=3.0587s mapping=0.0030s total=3.1129s]
What seems to be the problem here?
UPDATE:
I've added pathPattern to the descriptor as #Wain told me to, but now I'm getting an error. It looks like this:
"No mappable object representations were found at the key paths searched."
NSLocalizedFailureReason=The mapping operation was unable to find any nested object representations at the key paths searched: Banners, Branches, BranchTypes, Cities, MenuList
The representation inputted to the mapper was found to contain nested object representations at the following key paths: responseError, shortToken
This likely indicates that you have misconfigured the key paths for your mappings., NSLocalizedDescription=No mappable object representations were found at the key paths searched., keyPath=null}`
All of your response descriptors have pathPattern:nil, so RestKit can't filter and will apply all of them and see what happens. So, for all of your JSON you will get multiple objects containing only the parts of each mapping that match the JSON.
To fix, add path patterns to allow RestKit to determine which response descriptor matches each of your requests.
The correct way to do that is first to initialize the RestKit client:
NSURL *baseURL = [NSURL URLWithString:kServiceBaseURL];
self.manager = [RKObjectManager managerWithBaseURL:baseURL];
[self.manager setRequestSerializationMIMEType:RKMIMETypeJSON];
[self.manager setAcceptHeaderWithMIMEType:RKMIMETypeJSON];
[self.manager addResponseDescriptorsFromArray:[RKObjectManager sharedManager].responseDescriptors];
[self.manager addRequestDescriptorsFromArray:[RKObjectManager sharedManager].requestDescriptors];
[self.manager.HTTPClient.operationQueue setMaxConcurrentOperationCount:5];
[RKObjectManager setSharedManager:self.manager];
Than to initialize the Routes that you want:
RKRoute *shortTokenRoute = [RKRoute routeWithClass:[RKShortToken class] pathPattern:#"users/login/quick/shortToken" method:RKRequestMethodGET];
shortTokenRoute.shouldEscapePath = YES;
[self.manager.router.routeSet addRoute:shortTokenRoute];
Than to create a reponseDescriptor:
RKObjectMapping *shortTokenMapping = [RKObjectMapping mappingForClass:[RKShortToken class]];
[shortTokenMapping addAttributeMappingsFromDictionary:#{ #"responseError" : #"responseError", #"shortToken" : #"shortToken" }];
RKResponseDescriptor *shortTokenDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:shortTokenMapping
method:RKRequestMethodAny
pathPattern:#"users/login/quick/shortToken"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:shortTokenDescriptor];
Than the request:
NSDictionary *params = #{ #"phone" : telephone, #"extraCode" : extraCode };
[[RKObjectManager sharedManager] getObject:[[RKShortToken alloc] init]
path:#"users/login/quick/shortToken"
parameters:params
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSLog(#"%#", operation.HTTPRequestOperation.responseString);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
NSLog(#"%#", error.localizedDescription);
}];
Enjoy.

Custom request mapping on collection with RestKit 0.20

I'm trying to find a way to properly map a collection of objects to a JSON dictionary with a specific format.
I have an object with the following interface (partial):
#interface Reward : NSObject
...
#property (nonatomic, copy) NSString* title;
#property (nonatomic, copy) NSString* comment;
#property (nonatomic, strong) NSMutableOrderedSet* receivers; //set of User
...
#end
And the User object (partial) is:
#interface User : NSManagedObject
...
#property (nonatomic, strong) NSNumber* userId
...
#end
The goal is to POST a Reward object, along with the receivers property.
I could come up with an RKObjectMapping that works for title and comment attributes, but the receivers collection requires the following format:
"receivers":{"0":"<user_id_of_first_user>", "1":"<user_id_of_second_user>", ...}
My main problem is how to insert the index as a key.
I could do it manually and tweak the NSURLRequest HTTPBody, but I was hoping to find a more clean/RestKit way.
Thanks in advance.
if you want to do that's you need, as you said, use NSMutableURLRequest and add in your reward method request which gives NSString with your json this simple code can help you and other developers like me:
RKObjectManager *manager = [RKObjectManager managerWithBaseURL:[RKObjectManager baseUrl]];
Reward *reward = [[Reward alloc] init];
RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Reward class]];
RKResponseDescriptor *desc = [RKResponseDescriptor responseDescriptorWithMapping:mapping method:RKRequestMethodPOST pathPattern:nil keyPath:nil statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[manager addResponseDescriptor:desc];
RKObjectManager *objectManager = [RKObjectManager sharedManager];
NSMutableURLRequest *request =
[objectManager requestWithObject:reward method:RKRequestMethodPOST path:#"yourpath" parameters:nil];
NSString *str = [NSString stringWithFormat:#"\"receivers\":%#",reward.request];
[request setHTTPBody:[str dataUsingEncoding:NSUTF8StringEncoding]];
RKObjectRequestOperation *operation = [[RKObjectRequestOperation alloc] initWithRequest:request responseDescriptors:#[desc]];
[operation setCompletionBlockWithSuccess:success failure:failure];
operation.targetObject = reward;
[operation start];
I hope it`s help someone

Resources