AFNetworking 2.0 : Cannot POST with JSON from IOS

11,671

Solution 1

Actually, I finally got it to work.

Basically, for my requestSerializer of the AFHTTPRequestOperationManager, I was using AFHTTPRequestSerializer and then trying to set the Content-Type to "application/json"

But once I switched to using AFJSONRequestSerializer instead, it works fine now

AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];

operationManagerInstance.requestSerializer = requestSerializer;

Solution 2

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
AFJSONRequestSerializer *serializer = [AFJSONRequestSerializer serializer];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[serializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
manager.requestSerializer = serializer;

now it will work.

Solution 3

I encountered the same problem using AFNetworking API through Swift, trying to send a post request and finally got it work as well thanks to user1805458's post.

Basically, for my requestSerializer of the AFHTTPRequestOperationManager, I was also using AFHTTPRequestSerializer and then trying to set the Content-Type to "Application/JSON" and it did not work.

But once I switched to using AFJSONRequestSerializer instead, it works fine now:

        let manager = AFHTTPRequestOperationManager()
        manager.requestSerializer = AFJSONRequestSerializer(writingOptions: nil)

        // Contrary to user1805458's solution, I did not need to use these two instructions below using Swift.
        // manager.requestSerializer.setValue("Application/JSON", forHTTPHeaderField:"Content-Type")
        // manager.requestSerializer.setValue("Application/JSON", forHTTPHeaderField:"Accept")

I hope it will help you to fix this error in case where you use Swift, AFNetworking and try to send a post request containing a JSON body.

Share:
11,671

Related videos on Youtube

user1805458
Author by

user1805458

Updated on June 04, 2022

Comments

  • user1805458
    user1805458 almost 2 years

    Ever since upgrading my IOS code to use AFNetworking version 2.0 instead of 1.x, I cannot do an HTTP Post any more with JSON parameters.

    I suspect it is because my HTTP request header is not "application/json" but I have tried to do that and it still does not work.

    This is my test code for trying to POST by JSON:

    NSDictionary *parameters = [NSDictionary dictionaryWithObjectsAndKeys:
                                    email, @"email",
                                    password, @"password",
                                    nil];
    
    [[OTApiClient sharedInstance] POST:@"login" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSLog(@"result: %@", responseObject);
    
            Boolean response = [[responseObject valueForKey:@"success"] boolValue];
            if(response == TRUE) {
                //ok, success
                NSLog(@"success");
    
                UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Success!" message:@"Successfully logged in" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                [alert show];
    
    
            } else {
                NSLog(@"Not successful");
    
                UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Sorry" message:@"The email or password is incorrect." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
                [alert show];
            }
    
    
            dispatch_async(dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.view animated:YES];
            });
    
    
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"error: %@ ,  for operation: %@", error, operation);
    
    
            UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"Sorry" message:@"There is a problem connecting to the server, please try again soon." delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
            [alert show];
    
    
            dispatch_async(dispatch_get_main_queue(), ^{
                [MBProgressHUD hideHUDForView:self.view animated:YES];
            });
        }];
    
    });
    

    and I keep getting this error :

    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa  error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0xca80730 {NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.} ,  for operation: <AFHTTPRequestOperation: 0xca6bee0, state: isFinished, cancelled: NO request: <NSMutableURLRequest: 0xca76040> { URL: http://1.2.3.4:9000/api/login }, response: <NSHTTPURLResponse: 0xc963d60> { URL: http://1.2.3.4:9000/error404 } { status code: 404, headers {
    "Content-Length" = 1809;
    "Content-Type" = "text/html; charset=utf-8";
    

    } }>

    I am very sure that the server is up and accessible because all other GET calls work properly.

    I have checked the updated documentation for AFNetworking 2.0 and it seems like what I have is the right way to do a JSON POST

    Please let me know if I missed anything

    Thanks IS

    • Grzegorz Krukowski
      Grzegorz Krukowski over 10 years
      Why "Content-Type" = "text/html; charset=utf-8"; instead of application/json ? Have you tried to fix that on server side ?
  • SML
    SML almost 8 years
    thanks. works perfectly. i have wasted almost 5 hours to debug and check the issue.