Reputation: 2136
I keep receiving the following error message: 2013-01-22 01:44:43.091 Section3App2[16625:6703] -[__NSCFArray length]: unrecognized selector sent to instance 0x23a48780
after submitting my AFNetworking Request. The idea behind the request is that we are sending a post request to a REST API with a JSON Request Body via POST. I have been fiddling with this all day and can't seem to figure out whats causing the problem.
CODE
NSString *string = @"[{\"code\": \"105N14560\"}]"; NSString * jsonString = string; NSData * data = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError * error = nil; id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; [request setHTTPBody:json]; // [request setValue:[NSString stringWithFormat:@"%d", string.length] forHTTPHeaderField:@"Content-Length"]; NSLog(@"request body:%@", request.HTTPBody); // NSLog(@"json: %@",json); // if (!json) { // // handle error // NSLog(@"fail"); // } AFJSONRequestOperation *operation2 = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) { NSLog(@"JSON: %@", JSON); } failure:nil]; [operation2 start];
That code successfully creates the request body but when it tries to run the block it throws the error and I'm completely stumped. All help would be greatly appreciated.
Upvotes: 0
Views: 1565
Reputation: 1563
Never try to build the JSON string yourself like you're doing in the first line. Use NSJSONSerialization
to convert from a JSON-compatible Obj-C data structure (like NSDictionary
or NSArray
) directly to an NSData
object to use as the body of the request. For example:
NSDictionary *JSON = [NSDictionary dictionaryWithObject:@"105N14560" forKey:@"code"];
id JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:error];
You should use the resulting JSONData
object for both the HTTPBody
of the request as well as the content-length
of the request. Here is a complete example:
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:URL]; // URL = wherever the request should be sent to
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/json" forHTTPHeaderField:@"content-type"];
id JSONData = [NSJSONSerialization dataWithJSONObject:JSON options:0 error:error];
if (JSONData) {
[request setValue:[NSString stringWithFormat:@"%d",[(NSData *)JSONData length]] forHTTPHeaderField:@"content-length"];
[request setHTTPBody:JSONData];
}
This just creates the request. The rest of it is straightforward using AFNetworking
, where using AFJSONRequestOperation
you just pass in the request as you've already done.
Upvotes: 3