Search code examples
iosnetwork-programmingpostresponseafnetworking

AFNetworking POST cannot return json data


I want to make a request with POST method and after that I want them to return the json data or NSDictionary, but they can only return the string when it succeed

Like NSString *response = [operation responseString];

Anyone know how to make them return NSdictionary instead of NSString?

-(IBAction)SubmitLogin:(id)sender{
    NSLog(@"Login");
   // NSLog(@"%@",username);

    //START FUNGSI UNTUK POST, PUT, DELETE

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:signinUrl];
    [httpClient defaultValueForHeader:@"Accept"];



    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                            @"someuser", @"username",
                            @"somepassword",@"password",
                            nil];

    NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST"
                                                            path:@""
                                                      parameters:params];

 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    [httpClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];

    [operation setCompletionBlockWithSuccess:
     ^(AFHTTPRequestOperation *operation,
       id responseObject) {
         NSString *response = [operation responseString];
         NSLog(@"response: %@",response);
     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
         NSLog(@"error: %@", [operation error]);
     }];


    //call start on your request operation
    [operation start];

Solution

  • This is what I use, feel free to fit it to your needs:

    -(void) loginWithUserID:(NSString*)usrID User:(NSString*)usr Password:(NSString *)psw Sender:(id)sender
    {
        if ([sender respondsToSelector:@selector(startLoading)]){
            [sender performSelector:@selector(startLoading)];
        }
    
        baseURL = [NSString stringWithFormat:
                      @"http://xxx.xxx.xxx.xxx/test/service.svc/weblogin"];
        NSString* serviceURL = [NSString stringWithFormat:
                               @"%@?userID=%@&user=%@&password=%@",baseURL,usrID,usr,psw;
    
        NSURL *url = [NSURL URLWithString:[serviceURL stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
    
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
    
        AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
            self.LoginOK = [JSON valueForKeyPath:@"LoginOK"];
            if (LoginOK.intValue == 1) {
                NSDictionary *usrData = [JSON valueForKeyPath:@"userData"];
                userData = [[UserData alloc]init];
                [userData readFromJSONDictionary:usrData];
                NSLog(@"Userdata: %@",userData);
                if ([sender respondsToSelector:@selector(loginSuccessful:)])
                {
                    [sender performSelector:@selector(loginSuccessful:)];
                }
            }else{
                UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"Error" message:@"No Correct Login Credentials" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
                [alertView show];
                ;}
    
        } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
            if ([sender respondsToSelector:@selector(stopLoading)]){
                [sender performSelector:@selector(stopLoading)];
            }
            [[[UIAlertView alloc] initWithTitle:@"Error"
                                        message:@"Loginservice not available! Check your connection!"
                                       delegate:nil
                              cancelButtonTitle:@"OK"
                              otherButtonTitles: nil] show];
            NSLog(@"Error: %@", error);
    
        }];
    
        [operation start];
        };
    

    EDIT: Oh and use a

    -(void)readFromJSONDictionary:(NSDictionary *)d
    {
    
        [self setProperty1:[d objectForKey:@"property1"]];
    }
    

    method to get all the properties out of that dictionary into a custom class.